Qt中的多线程有问题吗?

时间:2012-10-26 12:46:30

标签: c++ qt

我已经学习了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的评论,则程序会暂停。

这种方法有什么问题?我希望避免额外的课程,因为我的课程非常小。

1 个答案:

答案 0 :(得分:2)

while(lett.isRunning())
{
    //qDebug() << "Still Running!";
}
lett.quit();

非常错误。当前的线程正忙着等待,并且会一直在吃东西。但这不是你的问题。您的问题当然是 主要事件循环可能尚未开始 ,即您尚未执行QApplication.exec()

Qt使用事件来启动线程,当你使用movetoThreadstart时,特定事件在当前线程(即执行这些方法的线程)中排队。如果主事件循环已经开始,那么将尽快处理。但在你的情况下,我打赌你的主要功能是:

 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。请花点时间阅读。