我没有永久循环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的用法?
答案 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
。这很危险。