При нажатии кнопки воспроизведения создается рабочий объект, который перемещается в QThread и запускается QThread. В Интернете полно разных подходов к реализации такого неопределенного цикла (цикла выборки данных). Вот два основных подхода, с которыми я сталкивался чаще всего:
- Подход 1 (неопределенный, но прерываемый пользователем цикл плюс сон()< /code>):
Код: Выделить всё
class Worker(QObject):
def __init__(self, user_stop_event: Event)
self.user_stop_event = user_stop_event
def run(self):
while not 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):
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 по основам потоковой обработки не дает здесь четких советов. Оба работают на моей стороне, но я не совсем уверен, какой из них будет использоваться в реализации по умолчанию для последующих проектов.
Подробнее здесь: https://stackoverflow.com/questions/790 ... g-loop-wit