我有消息" 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;的问候,
萨姆
答案 0 :(得分:0)
您不是在等待线程,而是在等待任务。 线程将一直运行,直到QApplication删除全局QThreadPool实例为止。所以问题是-您泄漏QApplication还是将其正确销毁了?
答案 1 :(得分:0)
实际上,在DLL中使用Qt时,我也有同样的警告。在DLL的全局对象被破坏之前,Windows会在应用程序退出时杀死所有线程。全局对象析构函数是我删除QApplication实例的地方。这导致了不一致,因为QWaitConditions仍然认为线程在等待,而实际上本机线程不再运行,被Windows杀死,没有机会进行适当的清理。这就是导致此警告的原因。 即使在Qt中也无法修复。 Windows没有给我们任何机会执行任何清理,线程只是消失了。