2013-10-10 93 views
1

經過大量的實驗和從stackoverflow學習,我創建了一個QObject worker,一個QThread,並將我的QObject worker移動到我的QThread,並啓動了QThread - 它工作正常!Qt C++如何停止線程如果moveToThread

void TelnetServer::incomingConnection(qintptr socketDescriptor) 
{ 
    QThread * TelnetConnectionThread = new QThread(this); 
    TelnetConnection *worker = new TelnetConnection(socketDescriptor,TelnetConnectionThread); 
    connect(TelnetConnectionThread, SIGNAL(started()), worker, SLOT(start())); 
    connect(TelnetConnectionThread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
    worker->moveToThread(TelnetConnectionThread); 
    TelnetConnectionThread->start(); // Start the thread running 
} 

我認爲叫TelnetConnectionThread-> start()方法的的QThread內啓動事件循環(因爲它似乎運行)。現在的問題......我該如何阻止線程?我嘗試過:

QThread::quit(); 

但是當我關閉應用程序時線程仍在運行。這是否意味着exec循環沒有運行?我需要做其他事情來阻止這個線程嗎?或者它實際上停止了,但沒有被刪除?

+0

順便說一句,你使用我的答案中的舊代碼,你可能想看看我已經完成的重構,你不需要從'QTcpServer'中得到:) –

回答

-1

從設計和技術的角度來看,殺死正在運行的線程是一個壞主意。 通常線程必須擁有基於「終止」標誌的退出決定。例如,創建新的標誌「停止」,如果退出()插槽發信號標記標誌爲真。在一個線程函數中定期檢查標誌,如果它是真的 - 退出線程函數。

+0

這段代碼實際上設置了一個QThread內部的事件循環。從文檔中,quit()應該優雅地退出。 我有一種感覺,線程方法只是沒有聽到退出... – shash

+3

我想通了......我不得不將線程的完成信號連接到線程的deletelater插槽;那麼它的工作。所以線程停止了,只是沒有刪除 – TSG

+0

@Michelle:你是對的。 –