gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:24:49 27 4
gpt4 key购买 nike

我有一个 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 进行子类化,我可能会使其正常工作,但根据当前的建议,我宁愿避免这样做。

先感谢您。

最佳答案

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

timer_ptr = new QTimer(this);

但要正常工作,它应该是:
timer_ptr = new QTimer(0);

在析构函数中,手动删除对象:
timer_ptr->deleteLater();

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

快乐编码。

关于QTimer 超时信号在不同线程上运行时不调用槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com