|
发表于 2024-8-13 23:22:31
|
显示全部楼层
本楼为最佳答案
去除多余的QEventLoop和QTimer管理:直接使用QThread的run方法循环,并通过条件变量来控制暂停和恢复。
简化信号和槽的使用:直接在QThread中使用pyqtSignal来控制状态,无需额外的emit_函数。
移除不必要的threading.Event:QThread的isRunning方法已经足够用来判断线程是否在运行,结合条件变量(虽然在这个简单示例中未直接使用,但可以通过QMutex和QWaitCondition来实现更复杂的同步)。
以下是优化后的代码:
from PyQt5.QtCore import pyqtSignal, QThread, Qt
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
import sys
import time
class PrintThread(QThread):
pauseSignal = pyqtSignal()
resumeSignal = pyqtSignal()
def __init__(self):
super().__init__()
self.paused = False
def run(self):
while True:
if self.paused:
time.sleep(0.1) # 简单轮询检查暂停状态
continue
print(f"打印: {time.ctime()}")
time.sleep(1) # 模拟查询和打印操作
def pause(self):
self.paused = True
self.pauseSignal.emit()
def resume(self):
self.paused = False
self.resumeSignal.emit()
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
self.p_thread = PrintThread()
self.p_thread.start()
def fun1(self):
self.p_thread.pause()
print(f"发送暂停信号: {time.ctime()}")
for i in range(10):
time.sleep(1)
print(f'主线程正在运行: {i}')
self.p_thread.resume()
def init_ui(self):
self.ui = uic.loadUi("./测试.ui")
self.btn1 = self.ui.pushButton
self.btn1.clicked.connect(self.fun1)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.ui.show()
app.exec_() |
|