Principal::setValues
是一个成员函数,所以它的类型不与pthread_create
所需的功能的类型相符。
在一个线程中推出一个成员函数你可以声明一些静态方法,并将this
对象到它:
class Principal
{
...
static void* setValuesThread(void *data);
...
}
void* Principal::setValuesThread(void *data)
{
Principal *self = reinterpret_cast<Principal*>(data);
self->setValues();
return NULL;
}
// your code
void Principal::setValues()
{
QString velocidadCARGA=QString::number(VelocidadCargador);
QString velocidadLAVA=QString::number(VelocidadLavado);
ui->Velocidad_Carga->setText(velocidadCARGA);
ui->Velocidad_Lavado->setText(velocidadLAVA);
ui->lbl_CantidadActual_Banda_Principal->setNum(botellasCargadas);
}
void Principal::on_Start_Cargador_clicked()
{
pthread_t hilo3;
pthread_create(&hilo3, NULL, Principal::setValuesThread, this);
pthread_join(hilo3,NULL);
}
但如果Principal
是Qt物件(我想这是),该代码拿下不工作,因为在Qt中,只能从主线程访问小部件。
如果您想在工作线程中执行一些繁重计算,然后将结果传递给您的小部件,可以使用QThread
和Qt信号/插槽机制。
一个简单的例子:
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent = 0);
void run();
signals:
void dataReady(QString data);
}
void MyThread::run()
{
QString data = "Some data calculated in this worker thread";
emit dataReady(data);
}
class Principal
{
...
public slots:
void setData(QString data);
}
void Principal::setData(QString data)
{
ui->someLabel->setText(data);
}
void Principal::on_Start_Cargador_clicked()
{
MyThread *thread = new MyThread;
connect(thread, SIGNAL(dataReady(QString)), this, SLOT(setData(QString()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
这里是Qt的多线程技术的一些相关文章:
http://doc.qt.io/qt-5/thread-basics.html
http://doc.qt.io/qt-5/threads-technologies.html
这是一个过早pessimization有只存在线程计算的持续时间。这种计算应该在全局或专用线程池上使用['QtConcurrent :: run'](http://stackoverflow.com/q/32507937/1329652)完成。 –
在你的例子中,你为'QtConcurrent :: run'调用创建一个'QObject'包装器,只是为了能够发送关于它的Qt信号完成。这不是过早的悲观吗?我想在这个简单的例子中,应该使用哪种Qt多线程技术并不重要。 – hank
你也这么做。仅仅因为你的对象来自'QThread'并不是特别的。重要的是你应该使用现有的线程,而不是创建一个新线程。 –