• 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

    以前-好记性不如烂笔头 现在-好记性不如烂键盘
  • 相关阅读:
    显示等待WebDriverWait
    MySQL添加注释
    linux
    linux时区问题
    CentOS禁用笔记本touchpad
    Mysql事务隔离级别
    IDEA集成有道翻译插件/maven帮助插件/mybatis插件
    SVN服务器的搭建和使用
    IntelliJ IDEA工具的安装使用
    IntelliJ IDEA的使用操作链接
  • 原文地址:https://www.cnblogs.com/gexbooks/p/14668479.html
Copyright © 2020-2023  润新知