Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Qt信号和插槽问题_Multithreading_Qt_Signals - Fatal编程技术网

Multithreading Qt信号和插槽问题

Multithreading Qt信号和插槽问题,multithreading,qt,signals,Multithreading,Qt,Signals,我的信号和插槽有问题,我想使用backgroundworker,这是一个额外的线程。它假设发送一个带有几个双值的信号,然后在主gui中更新。代码会编译,线程也会启动,但gui不会更新值 首先是gui插槽: void MainWindow::slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage) { ui->pmt

我的信号和插槽有问题,我想使用backgroundworker,这是一个额外的线程。它假设发送一个带有几个双值的信号,然后在主gui中更新。代码会编译,线程也会启动,但gui不会更新值

首先是gui插槽:

void MainWindow::slot_set_values(double ptm_temp, double ptm_hv, double heat_temp, double nomtemp, double current, double voltage)
{
    ui->pmtValueLabel->setText(QString::number(ptm_temp));
    ui->hvValueLabel->setText(QString::number(ptm_hv));
    ui->heatValueLabel->setText(QString::number(heat_temp));
    ui->nomValueLabel->setText(QString::number(nomtemp));
    ui->currenValueLabel->setText(QString::number(current));
    ui->vValueLabel->setText(QString::number(voltage));

}
工人代码:

void dworker::run()
{
    qsrand(QDateTime::currentDateTime().toTime_t());
    mData.set_pmt_temp(qrand()%100);
    mData.set_pmt_hv(qrand()%100);
    mData.set_heat_opt_temp(qrand()%100);
    mData.set_heat_nominal_temp(qrand()%100);

    for (int i = 0; i<100; i++)
    {
        double pmt_tmp = mData.get_pmt_temp();
        double hv = mData.get_pmt_hv();
        double heat_temp = mData.get_heat_opt_temp();
        double heat_nom = mData.get_heat_nominal_temp();

        emit set_values(pmt_tmp,hv,heat_temp,heat_nom,0,0);
        emit set_pmt();

        QThread::msleep(1000);
        qDebug() << "Test vom Thread " << i;
    }
}

如果发送信号的对象和接收器对象位于不同的线程中,则应使用
Qt::QueuedConnection
(docs)将其连接起来

因此,请更改您连接到此的内容:

connect(workerthread,SIGNAL(set_values(double,double,double,double,double,double)), this,SLOT(slot_set_values(double,double,double,double,double,double)),Qt::QueuedConnection);
connect(workerthread,SIGNAL(set_pmt()),this,SLOT(slot_set_pmt()),Qt::QueuedConnection); 
此外,您可以尝试通过qDebug检查您在插槽中收到了什么:

qDebug()<<"my slot is called,"<<ptm_temp<<" "<<ptm_hv<<" "<<heat_temp<<" "<<nomtemp<<" "<<current<<" "<<voltage;

qDebug()

因此,请更改您连接到此的内容:

connect(workerthread,SIGNAL(set_values(double,double,double,double,double,double)), this,SLOT(slot_set_values(double,double,double,double,double,double)),Qt::QueuedConnection);
connect(workerthread,SIGNAL(set_pmt()),this,SLOT(slot_set_pmt()),Qt::QueuedConnection); 
此外,您可以尝试通过qDebug检查您在插槽中收到了什么:

qDebug()<<"my slot is called,"<<ptm_temp<<" "<<ptm_hv<<" "<<heat_temp<<" "<<nomtemp<<" "<<current<<" "<<voltage;

qDebug()什么是dWorker类?它是您派生的类吗?如果是,您是否记得包含Q_OBJECT宏?另外,在调试器中运行时,当它通过连接线时,您会得到什么输出?如果有问题,它会告诉您。您是否尝试在插槽中添加qDebug语句以查看是否调用了它?我包括了一个qDebug语句,它正在调用,但不会将文本设置为我想要的:-(dworker类是从QThread派生的。@SeriousSammy与您的问题并不完全相关,但是当您创建工作线程时,不要子类
QThread
。子类
QObject
QThread
用于管理线程,而不是处理数据。dworker类是什么?它是您派生的类吗那么,您是否记得包含Q_OBJECT宏?另外,在调试器中运行时,当它通过连接线时,您会得到什么输出?如果有问题,它会告诉您。您是否尝试在插槽中添加qDebug语句以查看是否调用它?我包含了一个qDebug语句,它正在被调用,但不会将文本设置为我想要的:-(dworker类是从QThread派生的。@SeriousSammy与您的问题并不完全相关,但是当您创建工作线程时,不要子类
QThread
。相反,子类
QObject
QThread
用于管理线程,而不是处理数据。