QT有问题的多线程

Multi-threading in Qt problematic?

本文关键字:多线程 有问题 QT      更新时间:2023-10-16

我已经学习了一段时间,几天前我决定通过QThread进行多线程。我一直在关注这个人。因为他说子分类 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的评论,则该程序暂停。

这种方法有什么问题?我想避免那个额外的课程,因为我的程序很小。

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个线程,并永远闲置。他们什么都没做,但是他们正在运行(即使您删除了循环)。

这是关于QT线程的文章。请花时间阅读它。