QThread :: finished()永远不会被发出?

时间:2012-10-18 02:29:51

标签: multithreading qt4

我没有永久循环like this question,但它仍然没有发出finished()信号,

在类的构造函数中:

connect (&thread, SIGNAL(started()), SLOT(threadFunc()));
connect (&thread, SIGNAL(finished()), SLOT(finished()));

在finished()函数中,

void XX::finished()
{
  qDebug() << "Completed";
}

void XX::threadFunc()
{
  qDebug() << "Thread finished"; // only single line, finishes immediately
}

但是在我用finished()开始线程之前,我从未看到thread.start()被调用,我必须手动调用thread.terminate(),我是否误解了QThread的用法?

1 个答案:

答案 0 :(得分:1)

QThread方法完成时,

finished将发出QThread::run信号。也许,你有不正确的实现。

run方法的默认实现如下所示。它只是调用另一个exec方法。

void QThread::run()
{
    (void) exec();
}

exec方法的实现有点复杂。现在我简化了它。

int QThread::exec()
{
    // .....

    if (d->exited) {
        return d->returnCode;   
    }

    // ......

    QEventLoop eventLoop;
    int returnCode = eventLoop.exec();
    return returnCode;
}

根据代码判断,它可以在两种情况下完成。在第一种情况下,如果它已经退出。第二,它进入事件循环并等待,直到调用exit()

我们现在可以看到,你的无限线程循环就在这里。因此,您需要QThread::quit(),它等于QThread::exit(0)

P.S。请勿使用terminate。这很危险。