2

我学习 Qt 已经有一段时间了,几天前我决定通过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无限循环运行!它根本不是从那里出来的。我qdebug在 3 个插槽的实现内部使用来检查它是否正在进入它们,令人惊讶的是,没有一个插槽被调用。为什么呢?如果我删除评论,.wait那么程序会暂停。

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

4

1 回答 1

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 个已启动的线程,并永远保持空闲状态。他们没有做任何事情,但他们正在运行(即使您删除了循环)。

这是一篇关于 Qt threading的文章。请花时间阅读。

于 2012-10-26T13:14:50.733 回答