【问题标题】:How to terminate a QThread?如何终止 QThread?
【发布时间】:2009-08-24 07:27:10
【问题描述】:

QThread::terminate() 文档声明不鼓励通过调用此函数来终止线程。
在我的程序中,我需要在线程完成执行之前终止它。线程正在执行一些繁重的计算,我希望用户能够控制停止计算。
我该怎么做而不是打电话给QThread::terminate()

【问题讨论】:

    标签: c++ qt qthread


    【解决方案1】:

    从线程外部设置一个标志,该标志由线程内的计算检查,如果设置了该标志,则停止计算。

    【讨论】:

      【解决方案2】:

      使用标志是一种显而易见且最常用的方法,但如果您在 linux/unix 平台上工作,我建议您改用管道。我在使用标志时遇到了同样的问题(这使得代码线程不安全,并且很难跟踪由这种标志引起的错误),然后我将实现更改为使用管道,这是一种有效的解决方法。

      如果您愿意,对于 linux 平台,我可以向您展示如何使用管道来终止 QThread。

      你可能也有windows等价的管道,我不太了解,因为我没有在Windows平台上做过很多编程。

      希望对你有帮助

      【讨论】:

      • 我是Windows平台,对管道一窍不通。
      • @Donotalo,管道是进程间通信(IPC)的一种形式,顾名思义,它用于线程之间的通信。我使用管道来消除使用单例模式(或者我应该说是反模式:-) 时出现的某些同步问题。
      • 标志问题的发生仅仅是因为它是一个共享数据结构,并且必须得到充分的保护(例如,通过QMutex)。一个稍微肮脏的方法是滥用QThread::setPriority(QThread::IdlePriority);并在你的计算循环中检查QThread::priority
      【解决方案3】:

      最好使用标志 + 互斥锁,这将使解决方案线程安全。

      【讨论】:

        猜你喜欢
        • 2010-12-26
        • 2015-01-06
        • 2021-10-25
        • 1970-01-01
        • 2013-11-10
        • 2015-09-08
        • 2019-10-05
        • 1970-01-01
        • 2020-03-12
        相关资源
        最近更新 更多