pyqt5 线程 (QThread)启动、挂起、恢复、终止问题见解

最近写程序一直搞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

posted @ 2021-04-16 19:24  Gex  阅读(11167)  评论(0编辑  收藏  举报