c++ - 创建放置在错误线程中的新对象
问题描述
我有在线程中运行的 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错误调用方法的上下文中)的答案:
- 为什么(当我调用上面的代码时)来自 Thread #0 它报告为在线程 #1 中运行
- 为什么当我在上面的代码中创建一个新线程时,新对象也没有在线程 #0 中运行
顺便说一句,我的问题已解决,但我认为一个好的解释会对每个人都有帮助。
解决方案
QThread 不是Qt 线程,也就是说,它不是 Qt 实现的一种新型线程,而是 QThread 是一个线程管理器,所以只有 run 方法中执行的代码会在那个辅助线程中执行,其他的都会在QThread 所属的线程为 QObject。
如果 QThread 是在主线程中创建的,那么其他一切都会是。
所以你有2个选择:
覆盖运行方法并在那里创建类“硬件”的对象,或者
使用 moveToThread。
第二个最好。
推荐阅读
- html - 如何根据css中的当前页面更改边框颜色
- json - 尝试检查并计算从 API 返回的 JSON
- javascript - 在 highcharts 中的图表和数据表之间切换
- git - GitHub Desktop:致命错误“无法创建 /project/.git/index.lock:没有这样的文件或目录”
- node.js - 如何在 TypeScript 界面中定义 mongoose _id?
- node.js - Cucumber js如何提供共享步骤定义
- python - LSTM 高损失,不随每个时期减少
- c++ - 构造函数不抛出异常
- javascript - 禁用 form.submit 上的按钮会导致它在发布的数据中被跳过
- python - Python:使用另一个邮箱发送电子邮件