我已经学习了Qt一段时间,前几天我决定继续QThread
进行多线程处理。我一直关注this人。因为他说子类化QThread
不是合适的方式,而是使用QObject
。我正在遵循他的方法。但他创造了另一个继承自QObject
的类。我决定做一些改变:
class myclass
{
private:
dowork();
private slots:
slota();
slotb();
slotc();
}
myclass::dowork()
{
QThread lett;
QThread latt;
QThread pltt;
QObject lethread;
connect(&lett, SIGNAL(started()), this, SLOT(slota()));
lethread.moveToThread(&lett);
QObject lathread;
connect(&latt, SIGNAL(started()), this, SLOT(slotb()));
lathread.moveToThread(&latt);
QObject plthread;
connect(&pltt, SIGNAL(started()), this, SLOT(slotc()));
plthread.moveToThread(&pltt);
lett.start();
latt.start();
pltt.start();/*
lett.wait();
latt.wait();
pltt.wait();*/
while(lett.isRunning())
{
//qDebug() << "Still Running!";
}
lett.quit();
}
如果我运行该程序,它会无限循环运行while
!根本不是这样的。
我在3个插槽的实现中使用qdebug
来检查它是否正在输入它们,并且令人惊讶的是没有任何插槽被调用。为什么会这样?
如果我删除.wait
的评论,则程序会暂停。
这种方法有什么问题?我希望避免额外的课程,因为我的课程非常小。
答案 0 :(得分:2)
while(lett.isRunning())
{
//qDebug() << "Still Running!";
}
lett.quit();
非常错误。当前的线程正忙着等待,并且会一直在吃东西。但这不是你的问题。您的问题当然是 主要事件循环可能尚未开始 ,即您尚未执行QApplication.exec()
。
Qt使用事件来启动线程,当你使用movetoThread
,start
时,特定事件在当前线程(即执行这些方法的线程)中排队。如果主事件循环已经开始,那么将尽快处理。但在你的情况下,我打赌你的主要功能是:
int main(){
QApplication app();
myclass onlyclassIwanttomake;
onlyclassIwanttomake.dowork();
app.exec(); <----HERE!!!
}
当主线程执行app.exec();
时,线程将被启动。当您忙着等待时,您正在阻止主线程处理启动您所需的事件
事件
编辑:嗯,另一个问题是
lett.start();
latt.start();
pltt.start();
启动3个启动的线程,并永远保持空闲状态。他们没有做任何事情,但他们正在运行(即使你移除你的循环)。
这是entry written about Qt threading。请花点时间阅读。