zoukankan      html  css  js  c++  java
  • 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

    以前-好记性不如烂笔头 现在-好记性不如烂键盘
  • 相关阅读:
    js中操作Map集合
    js中json字符串与map的相互转化
    安卓开发--个人软件开发-day05
    javabean工具类方法lombok
    hadoop的datanode没有正常启动
    安卓开发--个人软件开发-day04
    安卓开发--个人软件开发-day03
    bigData学习笔记-hadoop总结
    spring框架学习之mybatis
    安卓开发--个人软件开发-day02
  • 原文地址:https://www.cnblogs.com/gexbooks/p/14668479.html
Copyright © 2011-2022 走看看