2015-09-14 56 views
4

我得到这个错误消息时我编译我的项目:如何从mainWindow类(Principal)中加入运行函数的线程?

“无法转换从类型‘校长:: setValues方法’'无效*(首席::)(无效*)为键入“无效*() (空隙)”“ ...

enter code here 
void* Principal:: setValues(void*){ 
    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); 
    return NULL; 
} 


void Principal::on_Start_Cargador_clicked(){ 
    pthread_t hilo3; 
    pthread_create(&hilo3,NULL,setValues,NULL);//error in this line. 
    pthread_join(hilo3,NULL); 
} 

回答

3

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

+0

这是一个过早pessimization有只存在线程计算的持续时间。这种计算应该在全局或专用线程池上使用['QtConcurrent :: run'](http://stackoverflow.com/q/32507937/1329652)完成。 –

+0

在你的例子中,你为'QtConcurrent :: run'调用创建一个'QObject'包装器,只是为了能够发送关于它的Qt信号完成。这不是过早的悲观吗?我想在这个简单的例子中,应该使用哪种Qt多线程技术并不重要。 – hank

+0

你也这么做。仅仅因为你的对象来自'QThread'并不是特别的。重要的是你应该使用现有的线程,而不是创建一个新线程。 –

相关问题