gpt4 book ai didi

c++ - Qt C++ - 如何将数据从工作线程传递到主线程?

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:05 24 4
gpt4 key购买 nike

我正在尝试在 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

但不幸的是没有输出应该显示这条消息

webcamClass 属于父线程,而 workerClass 属于 - 你猜对了 - 工作线程。

有人可以解释如何设置我的连接以便触发 mySlot() 吗?

谢谢!

最佳答案

在您粘贴到 pastebin.com/UpPfrNEt 的代码中,您有一个使用 while (1)getVideoFrame 方法。如果调用此方法,它会一直运行并阻止事件循环处理信号。您可以通过多种方式解决它,我认为最佳做法是将 while(1) 替换为其他内容。

关于c++ - Qt C++ - 如何将数据从工作线程传递到主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com