信号先前QThread事件循环开始丢失

时间:2012-03-09 17:14:09

标签: c++ qt

我遇到信号丢失的情况,我不明白为什么 - 通常在事件循环开始之前发送的信号只是排队等待然后发送。

这是代码的样子(对于QThread对象):

void OffloadHandler::run()
{
    cout << "Start" << endl;
    connect( this, SIGNAL(loopStarted()), SLOT(onLoopStarted()), Qt::QueuedConnection );
    emit loopStarted();
    exec();
}

void OffloadHandler::onLoopStarted()
{
    cout << "Here!" << endl;
}

线程在其他地方启动,Start写入控制台但Here1永远不会 - 未收到信号。我在主消息循环中使用相同的模式并且它可以工作,但是在这个线程消息循环中它看起来不起作用。

我的代码中有什么明显的错误吗?

2 个答案:

答案 0 :(得分:1)

您的代码有效且应该运行。您确定在创建oh的线程中运行了事件循环吗?

因为emit loopStarted()应该向oh的事件循环发送一个事件,该事件循环将被处理并将调用onLoopStarted()。我已经测试了你的代码,它对我有用。


顺便说一句,通常建议您不要向QThread添加广告位,并避免使用moveToThread( this );

不幸的是,我真的不了解你的用例,所以我无法提供更好的解决方案。但here是一些令人惊叹的文档,它对QThread s有很好的DO和DONT。

答案 1 :(得分:0)

好吧,我已经弄清楚了,我被QThread所有权的怪异所困扰。连接到QThread对象本身时必须非常小心,因为默认情况下该对象不归线程所有。

因此,在创建线程时,我必须将线程移动到线程:

OffloadHandler * oh = new OffloadHandler();
oh->moveToThread( oh ); //MOVE TO SELF!
oh->start();

一旦我这样做,信号就会按预期工作。