最近写程序一直搞pyqt5,线程是一个问题,以前我以为懂,现在看来是错误的。下面网址为总结2钟方法有兴趣的可以去看看。
https://blog.csdn.net/tcy23456/article/details/107904530
我发现和2中方法没有真正的终结线程,使用thread.isFinished()查看,有时线程依然正在运行。后发现QThread线程的run()函数没有return的话,也就是说run()没有结束,使用isFinished()查看为False,没有真正的finished,只是打印不在显示(不知是什么机制,没弄明白)。此时调用start()并没有效果。
上面链接2个例子都是如此效果,感兴趣可以去试试。
一个使用得到句柄
self.handle = ctypes.windll.kernel32.OpenThread(
win32con.PROCESS_ALL_ACCESS, False, int(QThread.currentThreadId()))
使用win32process.SuspendThread、win32process.ResumeThread控制,并用ctypes.windll.kernel32.TerminateThread(self._thread.handle, 0)终止。但调用isFinished显示线程依旧在运行。此时如果run()没有结束的话,不可以调用start()方法。同理另一个用锁的也是一样。
下面链接给出一种:
https://blog.csdn.net/zhangbinsijifeng/article/details/50032471
解决方法:
在finished()信号的槽中,调用该线程的wait()方法,该线程的wait()返回后,表明该线程真正的finished的了。然后调用start()方法
Qthread.deleteLater也只可在finished信号后使用。
Qthread.terminate()比较好用,调用isFinished返回True,这时可以调用start()方法。
注意:
self._thread = Worker(self)
self._thread.finished.connect(self._thread.deleteLater) #finished信号链接删除
使用deleteLater后不能使用terminate了。
参考:
https://blog.csdn.net/zhangbinsijifeng/article/details/50032471
https://blog.csdn.net/tcy23456/article/details/107904530
http://www.voidcn.com/article/p-hupzjhsq-ek.html