我遇到信号丢失的情况,我不明白为什么 - 通常在事件循环开始之前发送的信号只是排队等待然后发送。
这是代码的样子(对于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
永远不会 - 未收到信号。我在主消息循环中使用相同的模式并且它可以工作,但是在这个线程消息循环中它看起来不起作用。
我的代码中有什么明显的错误吗?
答案 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();
一旦我这样做,信号就会按预期工作。