QtConcurrent::run how to stop background task



我有这样的情况:停止由qtconcurrent启动的线程::run

我需要在 QMainWindow 中的 closeEvent 上关闭子线程(以 QtConcurrent::run 开头)。 但是我在子线程中的函数使用来自 *.dll 的代码:我不能使用循环,因为我所做的只是像调用外部 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.但这对我不好。

什么方法更简单更好,我该如何实现?有没有我没有列出的方法? 您能否提供小代码示例以供决策。感谢!

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();

最新更新