如果一个线程运行完成,就会结束。可很多情况并非这么简单,由于某种特殊原因,当线程还未执行完时,我们就想中止它。
不恰当的中止往往会引起一些未知错误。比如:当关闭主界面的时候,很有可能次线程正在运行,这时,就会出现如下提示:
QThread: Destroyed while thread is still running
这是因为次线程还在运行,就结束了UI主线程,导致事件循环结束。这个问题在使用线程的过程中经常遇到,尤其是耗时操作。
在此问题上,常见的两种人:
1.直接忽略此问题。
2.强制中止 - terminate()。
大多数情况下,当程序退出时,次线程也许会正常退出。这时,虽然抱着侥幸心理,但隐患依然存在,也许在极少数情况下,就会出现Crash。
正如前面提到过terminate(),比较危险,不鼓励使用。线程可以在代码执行的任何点被终止。线程可能在更新数据时被终止,从而没有机会来清理自己,解锁等等。。。总之,只有在绝对必要时使用此函数。
所以,我们应该采取合理的措施来优雅地结束线程,一般思路:
1.发起线程退出操作,调用quit()或exit()。
2.等待线程完全停止,删除创建在堆上的对象。
3.适当的使用wait()(用于等待线程的退出)和合理的算法。
下面介绍两种方式:
一.QMutex互斥锁 + bool成员变量。
这种方式是Qt4.x中比较常用的,主要是利用“QMu