我正在使用 PySide6 实现一个小型多线程 GUI 应用程序,以从(USB 连接的)传感器获取数据并使用 Qt 可视化数据。即,用户可以启动和停止数据获取:
单击播放按钮时,将创建一个工作对象并将其移动到QThread
,然后QThread
启动。互联网上有很多不同的方法来实现这种无限期(数据获取循环)。以下是我迄今为止最常遇到的两种主要方法:
- 方法 1(无限但用户可中断的循环加
sleep()
):
class Worker(QObject):
def __init__(self, user_stop_event: Event)
super().__init__()
self.user_stop_event = user_stop_event
def run(self):
while not self.user_stop_event.isSet():
self.fetch_data()
# Process received signals:
Qtcore.QApplication.processEvents()
# A sleep is important since in Python threads cannot run really in parallel (on multicore systems) and without sleep we would block the main (GUI) thread!
QThread.sleep(50)
def fetch_data(self):
...
- 方法 2(基于计时器的方法):
class Worker(QObject):
def __init__(self):
super().__init__()
timer = QTimer()
timer.timeout.connect(self.fetch_data)
timer.start(50)
def fetch_data(self):
...
两种方法都使用相同的机制来启动线程:
thread = QThread()
worker = Worker()
worker.moveToThread(thread )
thread.started.connect(worker.run)
...
这两种方法的优缺点是什么?哪种实现方式更可取?
不幸的是,Qt 的官方线程基础网站没有在这里给出明确的建议。 对我来说,两者都有效,但我不太确定哪一个应该作为我们后续项目的默认实现。