4

我有一个 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 的函数,该函数依次启动 QTimer 数据成员。当它超时时,什么也没有发生,但我希望定时器的 timeout() 信号连接到的 myObject 插槽被调用。问题是什么?你如何使这项工作。如果 myObject 在创建它的同一线程(即主线程)上运行,它可以完美地工作。

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

有人可以帮我吗?

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

先感谢您。

4

1 回答 1

3

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

timer_ptr = new QTimer(this);

但要正常工作,它应该是:

timer_ptr = new QTimer(0);

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

timer_ptr->deleteLater();

我猜当他们说不能将带有父对象的对象移动到线程时,他们确实是指所有对象,包括实际被移动到新线程的对象的数据成员。

快乐编码。

于 2012-11-05T02:42:17.977 回答