最初做法是通过传入函数,在QThread子线程的run方法中while(1)执行,导致程序跑一下就马上卡死强制退出,try,except也捕获不到错误,最后问了ChatGPT发现了原因,是因为pyqt5不支持在子线程中更新控件信息,所以应该用信号与槽来触发
更改后的代码为下图,通过不断触发信号来更新控件,原来是直接跑传进来的函数
class ShowDataThread(QThread):
show_signal = pyqtSignal()
def __init__(self, read_semaphore: QSemaphore, show_semaphore: QSemaphore):
super().__init__()
self.run_flag = True
self.read_semaphore = read_semaphore
self.show_semaphore = show_semaphore
def run(self) -> None:
while self.run_flag:
self.show_semaphore.acquire()
self.show_signal.emit()
self.read_semaphore.release()
def stop_show(self):
self.run_flag = False
self.show_thread = ShowDataThread(read_sem, show_sem)
self.show_thread.show_signal.connect(self.show_data_to_widget)