首页 > 解决方案 > 创建放置在错误线程中的新对象

问题描述

我有在线程中运行的 Qt5/C++ 代码。Main(线程#0)创建了我的新线程(线程#1),并在那里创建了一个新对象(“硬件”)。

我希望“硬件”对象存在于线程#1 中,因为它是在线程#1 中运行的代码中创建的。但是,经过大量调试后,下面的代码显示“硬件”位于线程 #0 中。

// Running in thread #1
m_hardwarePtr = new hardware();
qDebug() << "Start HW FROM Thread" << this->thread() << this->thread()->objectName();   
qDebug() << "Start HW IN Thread" << m_hardwarePtr->thread() << m_hardwarePtr->thread()->objectName(); 

为什么?我想我可以将 QThread 传递给上面的代码,然后将“硬件​​”移动到线程 #1 - 但我不应该......应该吗?

有人可以解释为什么会发生这种情况以及解决此问题的正确方法吗?

更新:

根据评论,我想补充一点,我上面的代码在一个名为 FROM thread #0 的方法中。当我更改代码以通过插槽调用上述方法时,它按预期工作!

为了其他人,我想接受一个解释(在直接从线程#0错误调用方法的上下文中)的答案:

  1. 为什么(当我调用上面的代码时)来自 Thread #0 它报告为在线程 #1 中运行
  2. 为什么当我在上面的代码中创建一个新线程时,新对象也没有在线程 #0 中运行

顺便说一句,我的问题已解决,但我认为一个好的解释会对每个人都有帮助。

标签: c++multithreadingqt5qthread

解决方案


QThread 不是Qt 线程,也就是说,它不是 Qt 实现的一种新型线程,而是 QThread 是一个线程管理器,所以只有 run 方法中执行的代码会在那个辅助线程中执行,其他的都会在QThread 所属的线程为 QObject。

如果 QThread 是在主线程中创建的,那么其他一切都会是。

所以你有2个选择:

  • 覆盖运行方法并在那里创建类“硬件”的对象,或者

  • 使用 moveToThread。

第二个最好。


推荐阅读