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】:
你有几个问题:
QThread
和 daqSlave
实例超出范围。使用new
并给线程一个父对象。 moveToThread()
自动将 daqSlv 重新分配给线程,所以这不是问题。
doSetup()
函数在您将工作线程移动到线程之前被调用。在调用QObject::connect()
时指定Qt::QueuedConnection
以解决此问题。
【讨论】:
以上是关于Qt线程不起作用的主要内容,如果未能解决你的问题,请参考以下文章