【问题标题】:Qt emit signal to object moved to threadQt 向移动到线程的对象发出信号
【发布时间】:2013-01-25 15:51:12
【问题描述】:

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

线程是这样实现的

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() 输出。 对象创建和连接发生在主窗口方法中。

不幸的是,我不知道自己做错了什么:一旦将对象移动到线程中,插槽就不再运行了。

【问题讨论】:

  • 你是否在第二个线程中运行事件循环?

标签: c++ qt signals-slots qthread


【解决方案1】:

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

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

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

此外,您的代码不会按原样编译/运行。我假设你已经在处理QApplication 的东西了——也就是说,在你的main 函数中设置好所有东西之后调用QApplication::exec()。如果您不调用exec(),则永远不会启动主事件循环。

【讨论】:

  • 谢谢,错过了您的回答。我会尽快调查的。
【解决方案2】:

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

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

解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2014-08-07
    相关资源
    最近更新 更多