Qt线程不起作用

Posted

技术标签:

【中文标题】Qt线程不起作用【英文标题】:Qt thread does not work 【发布时间】:2014-03-11 13:16:39 【问题描述】:

我有两个来自不同类的对象:“master”和“slave”。 我试图在 master.cpp 中创建一个线程,我已经在其中声明了从属对象。 问题是线程没有启动

QThreadEx daqThread;
daqSlave daqslv;
daqslv.doSetup(daqThread);
daqslv.moveToThread(&daqThread);
daqThread.start(QThread::NormalPriority);

其中:doSetup() 是:

 void daqSlave::doSetup(QThreadEx &cThread) const

   qDebug()<<"daqSlave::doSetup()-begin";
   QObject::connect(&cThread, SIGNAL(started()),
                     this, SLOT(avvio()));
   qDebug()<<"daqSlave::doSetup()-end";
 

“doSetup()”有效,但“avvio()”无效。 谁能解释我为什么? 谢谢, 阿莱西亚

【问题讨论】:

你的类型daqSlave是否继承自QObject 你把daqThread初始化放在哪里了?您是否知道一旦控制流离开该块,daqThread 将被破坏? 什么是QThreadEx?您是否在 daqSlave 类中使用了“Q_OBJECT”宏。 请注意,子类化 QThread(您似乎正在这样做)通常是在 Qt 中执行线程的错误方法。 QThread 是一个线程控制器/管理器,子类化它很容易导致代码在错误的操作系统线程中运行。如果您不知道这种情况如何发生以及如何避免它,请不要继承 QThread ;) 【参考方案1】:

你有几个问题:

QThreaddaqSlave 实例超出范围。使用new 并给线程一个父对象。 moveToThread() 自动将 daqSlv 重新分配给线程,所以这不是问题。 doSetup() 函数在您将工作线程移动到线程之前被调用。在调用QObject::connect() 时指定Qt::QueuedConnection 以解决此问题。

【讨论】:

以上是关于Qt线程不起作用的主要内容,如果未能解决你的问题,请参考以下文章

由于线程冲突 Qt C++,Google 语音识别不起作用

Qt从基于Qt示例的QThread下载文件不起作用

多部分上传在 QObject 中不起作用移动到线程

Qt 4.6.2 - QPropertyAnimation 不起作用

Qt:文件读取不起作用

QT:QFileInfo().exists() 不起作用