QtConcurrent ::运行如何停止后台任务

时间:2016-06-13 19:51:16

标签: multithreading qt concurrency qmainwindow

我的情况与此类似:stop thread started by qtconcurrent::run

我需要在QMainWindow中的closeEvent上关闭子线程(以QtConcurrent :: run开头)。 但我在子线程中的函数使用* .dll中的代码:我不能使用循环,因为我所做的一切 - 调用外部 dll就像

QFuture<void> = QtConcurrent::run(obj->useDllfunc_with_longTermJob());

当我用x按钮关闭应用程序时,我的gui已关闭,但第二个线程with_longTermJob()仍然有效,何时完成我有错误。 我知道一些决定:

  1. 使用其他功能,例如map()或其他功能 QFuture.cancel / stop功能,而不是QtConcurrent :: run()。但我只需要一个函数调用。 run()是我需要的。
  2. 或者使用QThread而不是Concurrent.But对我不好。
  3. 哪种方法更简单,更好,我该如何实现?有没有我没有列出的方法? 你能提供小代码样本作决定吗? THX!

1 个答案:

答案 0 :(得分:1)

QtConcurrent::run在这里不是问题。你必须有办法停止dllFuncWithLongTermJob。如果你没有这样的手段,那么你正在使用的API就会被破坏,而你运气不好。没有什么可以做的,一般都是安全的。强行终止线程会使堆处于不一致状态等 - 如果需要终止线程,则需要立即中止应用程序。

希望您可以调用类似stopLongTermJob的内容来设置一些中断dllFuncWithLongTermJob的标记。

然后:

auto obj = new Worker;
auto objFuture = QtConcurrent::run([=]{obj->dllFuncWithLongTermJob();});

要打断:

obj->stopLongTermJob(); // must be thread-safe, sets a flag
objFuture.waitForFinished();