QtConcurrent :: run => QWaitCondition:线程仍在等待时被破坏

时间:2015-05-08 19:30:03

标签: qt qtconcurrent

我有消息" QWaitCondition:当线程仍在等待时被破坏"在循环中启动 N 线程之后,在另一个循环中等待每个线程。

以下是代码:

int nb_threads = QThread::idealThreadCount();
QFuture<void> futures[nb_threads];
bool shared_boolean;
// launch threads
for(int i = 0;i<nb_threads;++i){
    futures[i] = QtConcurrent::run(this,gpMainLoopMT,&shared_boolean,&next_pop_size,next_population);
}

// wait for threads to finish
for(int i = 0;i<nb_threads;++i){
    futures[i].waitForFinished();
}

我无法弄清楚为什么会发生这种情况,而我正在等待每个线程......

有人有任何想法吗?

谢谢&amp;的问候,

萨姆

2 个答案:

答案 0 :(得分:0)

您不是在等待线程,而是在等待任务。 线程将一直运行,直到QApplication删除全局QThreadPool实例为止。所以问题是-您泄漏QApplication还是将其正确销毁了?

答案 1 :(得分:0)

实际上,在DLL中使用Qt时,我也有同样的警告。在DLL的全局对象被破坏之前,Windows会在应用程序退出时杀死所有线程。全局对象析构函数是我删除QApplication实例的地方。这导致了不一致,因为QWaitConditions仍然认为线程在等待,而实际上本机线程不再运行,被Windows杀死,没有机会进行适当的清理。这就是导致此警告的原因。 即使在Qt中也无法修复。 Windows没有给我们任何机会执行任何清理,线程只是消失了。