Qt线程关联性和moveToThread问题

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线程的方式仍然可能出什么问题?

谢谢 !

spi*_*orm 7

您只能moveToThread在以下情况下使用

  • 您的对象没有父对象(否则父对象将具有不同的线程亲和力)
  • 您位于对象的所有者线程上,因此实际上将对象从当前线程“推”到另一个线程

因此,您的错误消息表明您违反了第二种情况。您应该moveToThread从创建对象的线程中调用。
根据你

该对象具有QMainwindow作为父对象。

因此moveToThread将再次无法工作。您应该从m_poller对象中删除父对象


hmn*_*hmn 1

我认为问题在于 m_poller 的初始化,根据错误消息,它似乎被分配给与执行代码片段的线程不同的(第三个)线程。

另外,如果多次执行此代码,它可能第一次可以工作,但随后会失败,因为 m_poller 不再属于执行线程,而是属于 m_pollThread。