【问题标题】:Qt: How to cancel ALL processing of a QtConcurrent::map()?Qt:如何取消 QtConcurrent::map() 的所有处理?
【发布时间】:2016-01-23 16:23:02
【问题描述】:

我在 Windows7 平台上使用 Qt5。

在我当前的应用程序中,我使用QtConcurrent 来处理容器中的所有项目。
如果我决定退出应用程序,我将使用:QFuture::cancel()
根据文档http://doc.qt.io/qt-5/qfuture.html#cancel,并非所有异步计算都被取消。可能只取消尚未开始的那些?并且仍然允许运行/正在进行的计算继续运行?

如果上述假设是正确的并且QFuture::cancel()足够的,那么我应该怎么做才能停止运行(正在进行)处理并优雅地退出应用程序?

【问题讨论】:

    标签: multithreading qt concurrency parallel-processing cancellation


    【解决方案1】:

    您不能先发制人地优雅地终止异步操作。操作本身必须支持合作取消。

    换句话说,任何框架、库或操作系统都不可能为您提供此功能。您必须自己处理已经开始的取消操作。

    【讨论】:

    • 那么,您是说不可能强制停止计算from outside 处理线程?那么是否有common/best practice 来实现这一点(停止所有正在运行的线程)? Qt 有什么(实现)特定的东西吗?
    • @groenhen 他们回答的关键部分是不能优雅地终止。当然,您可以终止/杀死线程/进程,但这通常不是继续的方式。我不确定 Qt 是否在您使用的界面中公开了一种方法。
    • @groenhen 要优雅地取消,您需要将该逻辑构建到您的处理中。例如,如果算法由循环驱动,则每个循环迭代都可以检查操作是否已被取消并退出循环(即,不经过循环的所有迭代)。
    • @JamesAdkison:某种while (external_cancel_requested == false) { processing(); } 会符合您的建议吗? ...其中external_cancel_requested 是布尔易失变量?
    • @groenhen 我认为您有这个想法,但您发布的代码将无限运行processing,直到发生取消,这可能不是预期的。在这种情况下,您可能希望深入了解processing 并找出可以检查cancel 标志以提前退出的位置。
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多