c++ - Qt 线程关联和 moveToThread 问题

标签 c++ multithreading qt

我试图在 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/

相关文章:

c++ - 如何删除单例指针?

c++ - 如何删除 QPlainTextEdit 及其内容之间的空格?

c# - Qt/C++和C#,哪个先学?

c++ - 使用(输出)常量表达式定义数组

c++ - 函数中的默认参数 [C++]

c++ - VIM omnicppcomplete 对函数参数不起作用

c# - 你如何处理一个有挂起调用的线程?

multithreading - Tomcat maxThread取值困境

android - Android OpenGL ES 环境中的插值

c++ - 当窗口大小改变时,如何在 Qt 中自动缩放图表?