2013-04-23 341 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