2013-04-23 259 views
0

我已經使用QFuture來啓動一個函數的線程,這個函數在我的代碼中已經有了很長時間並凍結了我的GUI。如何在Qt中終止線程C++

線程似乎是確定的工作:

QFuture<int> result = QtConcurrent::run(&m_DC, &DatabaseController::getAll); 

然而,當getAll函數結束,我認爲這個線程仍然在運行,它不應該是,但我不知道該如何結束或完成它。我已經看過文檔,但它並沒有真正說清楚。

基本上我顯示進度條爲忙時,線程啓動,並希望當它結束

if(result.isRunning()) 
{ 
    ui->progressBar->setRange(0,0); 
    ui->progressBar->show(); 
} 

if(result.isFinished()) 
{ 
    ui->progressBar->hide(); 
} 

回答

0

使用QFutureWatcher來監視QtConcurrent ::運行返回QFuture隱藏它,連接QFutureWatcher ::完成到一個插槽來包裝您的progressBar的顯示。像

connect(&job_watcher_, 
     SIGNAL(finished()), 
     SLOT(endLengthyJob())); 

MainWindow.cpp

void MainWindow::endLengthyJob() 
{ 
    ui->progress_bar->hide(); 
} // end_slot(MainWindow::endLengthyJob) 

一個側面說明了一句:由QtConcurrent ::運行線程產生不能被終止。

+0

它根本不能被終止?如果你問我,這似乎很差。這個例子要求我有一個毫無意義的功能,儘管這在我的其他功能的權利結束時被稱爲?當然,我可以知道什麼時候該功能以某種方式結束? – AngryDuck 2013-04-23 09:15:01

+0

我曾經遇到類似的問題[鏈接](http://stackoverflow.com/questions/15377236/qt-terminate-thread-spawn-by-qconcurrentrun),檢查答案部分 – 2013-04-23 09:23:11

+0

只是花了一些時間爲我的應用程序排序此代碼並得到它所有排序連接信號到一個插槽,隱藏酒吧所有工作現在謝謝 – AngryDuck 2013-04-23 09:40:23