繁体   English   中英

Qt向移动到线程的对象发出信号

[英]Qt emit signal to object moved to thread

为了通过设置标志(然后从线程内返回)来启动停止线程,我需要与它进行通信。

线程是这样实现的

MyClass* obj = new MyClass(0);
connect( this,SIGNAL( stop() ),obj, SLOT(stop()));
emit stop();    // slot is called (qDebug output)

MyThread = new QThread;
obj->moveToThread(MyThread);
connect( ... started() ... quit() ... finished() ... deleteLater() ...
....

emit stop();    // slot isn't called (qDebug output)

该插槽还没有任何逻辑,它仅使用qDebug()输出。 对象的创建和连接在主窗口方法中进行。

不幸的是,我无法弄清楚自己在做什么:将对象移至线程后,插槽将不再运行。

也许您只是忘了复制/粘贴它,但是您错过了MyThread->start()调用。 同样,声明线程的行应该是QThread * MyThread = new QThread(); ,但这可能只是一个错字。

现在,在回答中,您说使用Qt::DirectConnection似乎已经解决了您的问题。 但是,使用直接连接调用的插槽仅直接调用slot方法。 slot方法正在运行,但从调用线程(发出stop()信号的位置)运行。 即使您的线程未启动,这也将起作用。 您真正想要的是通过Qt::QueuedConnection调用插槽。 这将在工作线程的事件循环中放置一个事件,然后将调用该插槽。 请注意,如果您未指定,Qt将处理连接类型。

如果排队的连接不起作用,则可能是您的工作阻塞了线程的事件循环。 在您的工作方法中,您是否曾经将控制权传递回事件循环以允许其处理事件? 还是只是在while循环中运行以等待标志更改状态?

另外,您的代码不会按原样编译/运行。 我假设您已经在处理QApplication东西-即,在您的main功能中设置完所有内容后,调用QApplication::exec() 如果不调用exec() ,则永远不会启动主事件循环。

调试输出实际上是在线程完成工作之后才发生的。 使用

connect( this, SIGNAL(stop()), obj, SLOT(stop()), Qt::DirectConnection);

解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM