JBL*_*JBL 5 c++ qt multithreading
我正在尝试使用Qt中的线程将一些工作委托给一个线程,但是我无法使其工作。我有一个继承QMainWindow的类,该类具有一个启动线程来工作的成员对象。该对象具有QMainwindow作为父对象。它包含并值得注意地初始化了另一个QObject,m_poller我想将其移到我创建的线程中:
m_pollThread = new QThread;
m_poller->moveToThread(m_pollThread);
//Bunch of connection
m_pollThread->start();
Run Code Online (Sandbox Code Playgroud)
我遵循了有关如何在Qt中管理线程而又不对其进行子类化(即不要做错)的准则,但是在VS中我仍然收到以下消息:
QObject :: moveToThread:当前线程(0x2dfa40)不是对象的线程(0x120cf5c0)。无法移动到目标线程(0x1209b520)
我发现以下似乎处理相同问题的帖子,但无法用答案修复我的代码。我觉得我实际上是在正确地调用moveToThread(因为我没有从另一个线程中调用它来“拉”一个对象),但是显然我仍然在那里缺少一些东西:如消息所暗示的那样,似乎已经有多个线程,而我对moveToThread()的调用似乎以错误的方式结束(尽管我承认我对此是全新的,并且可能会发现这是完全错误的...)
那么我使用Qt线程的方式仍然可能出什么问题?
谢谢 !
您只能moveToThread在以下情况下使用
因此,您的错误消息表明您违反了第二种情况。您应该moveToThread从创建对象的线程中调用。
根据你
该对象具有QMainwindow作为父对象。
因此moveToThread将再次无法工作。您应该从m_poller对象中删除父对象
我认为问题在于 m_poller 的初始化,根据错误消息,它似乎被分配给与执行代码片段的线程不同的(第三个)线程。
另外,如果多次执行此代码,它可能第一次可以工作,但随后会失败,因为 m_poller 不再属于执行线程,而是属于 m_pollThread。