如何终止 QThread?
Posted
技术标签:
【中文标题】如何终止 QThread?【英文标题】:How to terminate a QThread? 【发布时间】:2009-08-24 07:27:10 【问题描述】:QThread::terminate()
文档声明不鼓励通过调用此函数来终止线程。
在我的程序中,我需要在线程完成执行之前终止它。线程正在执行一些繁重的计算,我希望用户能够控制停止计算。
我该怎么做而不是打电话给QThread::terminate()
?
【问题讨论】:
【参考方案1】:从线程外部设置一个标志,该标志由线程内的计算检查,如果设置了该标志,则停止计算。
【讨论】:
【参考方案2】:使用标志是一种显而易见且最常用的方法,但如果您在 linux/unix 平台上工作,我建议您改用管道。我在使用标志时遇到了同样的问题(这使得代码线程不安全,并且很难跟踪由这种标志引起的错误),然后我将实现更改为使用管道,这是一种有效的解决方法。
如果您愿意,对于 linux 平台,我可以向您展示如何使用管道来终止 QThread。
你可能也有windows等价的管道,我不太了解,因为我没有在Windows平台上做过很多编程。
希望对你有帮助
【讨论】:
我是Windows平台,对管道一窍不通。 @Donotalo,管道是进程间通信(IPC)的一种形式,顾名思义,它用于线程之间的通信。我使用管道来消除使用单例模式(或者我应该说是反模式:-) 时出现的某些同步问题。 标志问题的发生仅仅是因为它是一个共享数据结构,并且必须得到充分的保护(例如,通过QMutex
)。一个稍微肮脏的方法是滥用QThread::setPriority(QThread::IdlePriority);
并在你的计算循环中检查QThread::priority
。【参考方案3】:
最好使用标志 + 互斥锁,这将使解决方案线程安全。
【讨论】:
以上是关于如何终止 QThread?的主要内容,如果未能解决你的问题,请参考以下文章