Qt C++ - 如何将数据从工作线程传递到主线程?
Qt C++ - How to pass data from a worker thread to main thread?
我正在尝试在Qt(C++(中执行线程间通信。我有一个工作线程,它执行一些计算,我希望工作线程在完成后将其结果返回到主线程。因此,我使用连接,我知道这要归功于调试,信号已成功发出,但它是未执行的插槽,我不明白为什么。
相关代码段:
webcamClass::webcamClass(QObject *parent) : QObject(parent)
{
workerThread = new QThread(this);
workerClassObj = new workerClass();
//connect for image
connect(workerClassObj, SIGNAL(mySignal(QPixmap)), this, SLOT(mySlot(QPixmap)));
//connect(&workerClassObj, workerClass::mySignal(QPixmap), this, webcamClass::mySlot(QPixmap));
connect( workerThread, SIGNAL(started()), workerClassObj, SLOT(getImage()) );
workerClassObj->moveToThread(workerThread);
}
void webcamClass:: foo()
{
workerThread->start();
}
void workerClass::getImage()
{
qint64 successFailWrite;
QImage img;
QPixmap pixmap;
... do some stuff with pixmap...
qDebug()<<"going to emit result";
emit mySignal(pixmap);
qDebug()<<"emitted";
}
void webcamClass::mySlot(QPixmap p)
{qDebug()<<"this message should be displayed"; }
相应的头文件:
class workerClass : public QObject
{
Q_OBJECT
private:
public:
explicit workerClass(QObject *parent = nullptr);
signals:
void mySignal(QPixmap);
};
webcamClass::webcamClass(QObject *parent) : QObject(parent)
{
Q_OBJECT
public:
explicit webcamClass(QObject *parent = nullptr);
public slots:
void mySlot(QPixmap p);
private:
QThread *workerThread;
workerClass *workerClassObj;
};
上面的代码只是输出:
going to emit result
emitted
但不幸的是没有输出this message should be displayed
.
网络摄像头类属于父线程,而工人类属于 - 你猜对了 - 工作线程。
有人可以解释如何设置我的连接以便触发 mySlot(( 吗?
谢谢!
在您粘贴的代码中 pastebin.com/UpPfrNEt 您有一个使用while (1)
的getVideoFrame
方法。如果调用此方法,它将始终运行并阻止事件循环处理信号。您可以通过多种方式解决它,我认为最佳做法是用其他东西替换 while(1(。
如果可能的话,我强烈建议您使用新的信号槽语法:
connect( SOURCEINSTANCE, &CLASS::SIGNAL, TARGETINSTANCE, &CLASS::SLOT );
在您的情况下,这可能是:
connect( workerClassObj, &workerClass::mySignal, this, &webcamClass::mySlot );
具体来说,对于您的情况,如果您想在线程之间传递信号和插槽,则必须小心。首先,检查连接调用的连接类型,其实际上是最后一个参数。
connect( workerClassObj, &workerClass::mySignal, this, &webcamClass::mySlot, Qt::QueuedConnection );
有关详细说明,请参阅此处: http://doc.qt.io/qt-5/signalsandslots.html
如果要传递自定义类型,必须先将它们声明为元类型。 例如,在您的构造函数中添加以下内容:
qRegisterMetaType("MyDataType"(;
请确保您的自定义数据类型具有默认构造函数,并注意 afaik、引用不能跨线程传递。
- C++为线程工作动态地分割例程
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 餐饮哲学家问题 - 只有 2 个线程工作
- 工作线程在执行太快后永久休眠
- 唤醒多个线程以在每个条件下工作一次
- Qt::D irectConnection在多线程环境中使用时如何工作?
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- c++线程的安全性和时间效率:为什么有互斥检查的线程有时比没有它的线程工作得更快
- 在多线程工作负载上解释Gperftools的结果
- 我的线程工作不好,它给出了所有结果,最后没有一个接一个,GUI 在线程运行期间挂起?
- BOOST::线程工作线程同步,C++和OpenCV
- 线程工作不正常
- 提升线程工作线程对象在线程完成后的重用
- 线程问题,其中一个线程工作,但导致调用方法不返回
- 线程工作目录
- MFC主UI线程工作和模态对话框
- 用类对象提升线程工作器