如何向另一个线程发出带有数组参数的信号

Posted

技术标签:

【中文标题】如何向另一个线程发出带有数组参数的信号【英文标题】:How to emit a signal with array parameter to another Thread 【发布时间】:2016-02-08 13:42:15 【问题描述】:

我是 Qt 的新手,我想用几个参数从 QThread 向主线程发出信号。它不起作用。我做错了什么?

//reader.h
signals:
        void updateData(quint16 fw, QString serial, quint16 *calibration);
//reader.cpp
...

    quint16 calibration[8];
    quint16 fw;
    QString serialNumber;
    readData(&fw, &serialNumber, calibration);
    // Declaration: void Reader::readData(quint16 *fw, QString *serial, quint16 *calibration) 
    emit updateData(fw, serialNumber, calibration); // In this function all parameters are assigned correctly

//mainwindow.h
 public slots:       
            void updateData(quint16 fw, QString serialNumber, quint16 *calibration);
//mainwindow.cpp
void MainWindow::updateData(quint16 fw, QString serialNumber, quint16 *calibration)
   
    ui->lineEditFW->setText(QString::number(fw));     // correct
    ui->lineEditSerialNumber->setText(serialNumber);  // correct
    ui->spinBoxReg1->setValue(calibration[0]);        // incorrect!
    ui->spinBoxReg2->setValue(calibration[1]);        // ..array calibration
    ui->spinBoxReg3->setValue(calibration[2]);        // ..is filled with
    ui->spinBoxReg4->setValue(calibration[3]);        // ..random data!
    ui->spinBoxReg5->setValue(calibration[4]);
    ui->spinBoxReg6->setValue(calibration[5]);
    ui->spinBoxReg7->setValue(calibration[6]);
    ui->spinBoxReg8->setValue(calibration[7]);

//...
init()

   // other connection of thread and reader object
   //...
   connect(reader, SIGNAL(updateData(quint16, QString, quint16 *)), this, SLOT(updateData(quint16, QString, quint16 *)));
   //...
   reader->moveToThread(readerThread);
   readerThread->start();

我也试过用数组而不是指针。效果也不好。

谢谢。

【问题讨论】:

【参考方案1】:

calibration[8] 在栈上,所以当你的 reader 函数返回时它会被销毁。您需要使其持久化(在堆上分配),以便在传递信号时它仍然存在。

【讨论】:

哦,是的。我将它更改为指针并分配了一个内存,它现在可以工作了。谢谢你提醒我。 @mimin - 不要忘记照顾那个内存 - 否则你会得到内存泄漏。如果你只使用一些容器而不是原始数组,这是最简单的。

以上是关于如何向另一个线程发出带有数组参数的信号的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个进程向多个其他进程发出信号?

第一个进入的线程如何向其他并发线程发出相同方法结束的信号?

如何向 Qt 中 QThread 类的特定对象发出信号?

唤醒线程信号

线程如何在完成时发出信号?

PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件