2012-10-18 88 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

相關問題