QTimer超时信号在其他线程上运行时不调用槽

时间:2012-11-04 00:00:00

标签: qt

我有一个QObject的子类,称为myObject,它在构造函数的堆上分配了一个QTimer数据成员。 myObject还有一个插槽,它连接到构造函数中的QTimer timeout()信号。我将myObject的指针称为myObject_ptr。

我想在主线程的不同线程上运行myObject。根据相对较新的建议,我不会继承QThread。在主线程中,我使用myObject如下:

QThread *thread = new QThread(this);
myObject_ptr->moveToThread(thread);
connect(myObject_ptr, SIGNAL(destroyed(), thread, SLOT(quit())); //thread not needed if no object
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); //to avoid memory leak
connect(thread, SIGNAL(terminated()), thread, SLOT(deleteLater())); //to avoid memory leak
thread->start();

主线程调用myObject_ptr的函数,myObject_ptr又启动QTimer数据成员。当它超时时,没有任何反应,但我希望调用定时器的timeout()信号所连接的myObject的插槽。问题是什么?你是如何做到这一点的。如果myObject在创建它的同一个线程(即主线程)上运行,它可以完美地工作。

从我所做的所有读数中,我认为我创建的新线程可能不会处理事件,因为它没有自己的事件循环。我还阅读与此相反的文档/文章,说当线程启动时,run()函数调用exec()并且你有一个事件循环。

有人能帮帮我吗?

如果我将QThread子类化,我可能会让它正常工作,但根据当前的建议,我宁愿避免这样做。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

我解决了我的问题!!在MyObject的构造函数中,计时器在堆上分配如下:

timer_ptr = new QTimer(this);

但要正常工作,应该是:

timer_ptr = new QTimer(0);

并在析构函数中手动删除对象:

timer_ptr->deleteLater();

我猜当他们说不能将父对象移动到一个线程时,他们确实意味着所有对象,包括对象的数据成员实际上被移动到新线程。

快乐的编码。