我试图在 Qt 中使用线程将一些工作委托(delegate)给线程,但我无法让它工作。我有一个继承 QMainWindow 的类,它有一个启动线程来工作的成员对象。该对象以 QMainwindow 作为父对象。它包含并初始化了另一个 QObject,m_poller
,我想将其移动到我创建的线程:
m_pollThread = new QThread;
m_poller->moveToThread(m_pollThread);
//Bunch of connection
m_pollThread->start();
我遵循了关于如何在 Qt 中管理线程而不对其进行子类化的指南(又名 not doing it wrong ),但我仍然在 VS 中收到以下消息:
QObject::moveToThread: Current thread (0x2dfa40) is not the object's thread (0x120cf5c0). Cannot move to target thread (0x1209b520)
我找到了 following post这似乎处理同样的问题,但无法用答案修复我的代码。我觉得我实际上是在正确地调用 moveToThread(因为我没有从另一个线程中调用它以将对象“拉”到它),但显然我仍然遗漏了一些东西:正如消息提示的那样,它似乎已经有多个线程,我对 moveToThread() 的调用似乎以错误的方式结束(尽管我承认我对此完全陌生并且可能会完全错误......)
那么我使用 Qt 线程的方式可能还有什么问题呢?
谢谢!
最佳答案
您只能在以下情况下使用moveToThread
- 您的对象没有父对象(否则父对象将具有不同的线程关联)
- 您在对象的所有者线程上,因此您实际上将对象从当前线程“推送”到另一个线程
所以你的错误信息说你违反了第二种情况。您应该从创建对象的线程调用 moveToThread
。
根据你的说法
This object has the QMainwindow as parent.
所以 moveToThread 将再次不起作用。您应该从 m_poller 对象中删除父对象
关于c++ - Qt 线程关联和 moveToThread 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16960166/