PyQt5线程休眠和唤醒

本是古典 何须时尚 2022-03-01 11:10 592阅读 0赞

在上一篇文章中我有写线程的终止 挂起和唤醒,下面这个例子是线程的休眠和唤醒,是通过线程内一个私有的属性来进行的,读者可以直接将代码跑起来
注:网上搜索的资源

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from PyQt5.QtCore import QThread, QWaitCondition, QMutex, pyqtSignal
  4. from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QProgressBar
  5. class Thread(QThread):
  6. valueChange = pyqtSignal(int)
  7. def __init__(self, *args, **kwargs):
  8. super(Thread, self).__init__(*args, **kwargs)
  9. self._isPause = False
  10. self._value = 0
  11. self.cond = QWaitCondition()
  12. self.mutex = QMutex()
  13. def pause(self):
  14. print("线程休眠")
  15. self._isPause = True
  16. def resume(self):
  17. print("线程启动")
  18. self._isPause = False
  19. self.cond.wakeAll()
  20. def run(self):
  21. while 1:
  22. self.mutex.lock()
  23. if self._isPause:
  24. self.cond.wait(self.mutex)
  25. if self._value > 100:
  26. self._value = 0
  27. self._value += 1
  28. self.valueChange.emit(self._value)
  29. self.msleep(100)
  30. self.mutex.unlock()
  31. class Window(QWidget):
  32. def __init__(self, *args, **kwargs):
  33. super(Window, self).__init__(*args, **kwargs)
  34. layout = QVBoxLayout(self)
  35. self.progressBar = QProgressBar(self)
  36. layout.addWidget(self.progressBar)
  37. layout.addWidget(QPushButton('休眠', self, clicked=self.doWait))
  38. layout.addWidget(QPushButton('唤醒', self, clicked=self.doWake))
  39. self.t = Thread(self)
  40. self.t.valueChange.connect(self.progressBar.setValue)
  41. self.t.start()
  42. def doWait(self):
  43. self.t.pause()
  44. def doWake(self):
  45. self.t.resume()
  46. if __name__ == '__main__':
  47. import sys
  48. import cgitb
  49. sys.excepthook = cgitb.enable(1, None, 5, '')
  50. from PyQt5.QtWidgets import QApplication
  51. app = QApplication(sys.argv)
  52. w = Window()
  53. w.show()
  54. sys.exit(app.exec_())

发表评论

表情:
评论列表 (有 0 条评论,592人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PyQt5篇】多线

    这是因为QThread类提供了一个事件循环,可以在后台处理线程的任务,而不会影响到线程的响应性。,当在主线程中执行耗时操作时(例如click_1方法中的for循环),它。...

    相关 线休眠

    线程对象一旦调用其`start`方法之后,就会运行,运行的就是`run`方法中的代码,等到`run`方法中的代码运行结束,线程就执行完成。