2012-10-18 91 views
1

我没有一个永远的循环like this question,但它仍然没有发出成品()信号,QThread :: finished()永远不会被发射?

在类的构造函数:

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

在成品()函数,

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

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

但我从来没有看到finished()被调用,每次开始之前,我与thread.start()线程,我必须手动调用thread.terminate(),做我误解的QThread的使用情况如何?

回答

1

QThreadQThread::run方法结束时将发出finished信号。也许,你有这个不正确的执行。

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

实施 exec方法的
void QThread::run() 
{ 
    (void) 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。有危险。

+1

嗯,我没有继承QThread,只是使用它的信号 – daisy

+1

@ warl0ck所以它意味着你的线程有默认的实现并等待exit,正如我上面所说的。 – fasked

相关问题