QTimer超时信号在不同线程上运行时不调用插槽

QTimer超时信号在不同线程上运行时不调用插槽,qt,Qt,我有一个称为myObject的QObject子类,它在构造函数的堆上分配了一个QTimer数据成员。myObject还有一个插槽,它连接到构造函数中的QTimer timeout()信号。我将myObject的指针称为myObject_ptr 我想在与主线程不同的线程上运行myObject。按照相对较新的建议,我没有将QThread子类化。在主线程中,我使用myObject如下: QThread *thread = new QThread(this); myObject_ptr->move

我有一个称为myObject的QObject子类,它在构造函数的堆上分配了一个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();
timer_ptr = new QTimer(this);
主线程调用myObject_ptr的函数,该函数反过来启动QTimer数据成员。当它超时时,不会发生任何事情,但我希望调用与计时器的timeout()信号连接的myObject的插槽。有什么问题?你是如何做到这一点的。如果myObject在创建它的同一线程(即主线程)上运行,则它可以完美地工作

从我所做的所有阅读资料来看,我认为我正在创建的新线程可能没有处理事件,因为它没有自己的事件循环。我还阅读了与此相反的文档/文章,说当线程启动时,run()函数调用exec(),您就有了一个事件循环

有人能帮我吗

如果我将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();
timer_ptr = new QTimer(this);
但要正确工作,它应该是:

timer_ptr = new QTimer(0);
在析构函数中,手动删除对象:

timer_ptr->deleteLater();
我猜当他们说不能将一个具有父对象的对象移动到线程时,他们实际上是指所有对象,包括实际移动到新线程的对象的数据成员


愉快的编码。

我的代码与您的代码几乎完全相同,但这并没有解决我的问题。