QThread msleep() и QTimer в PyQt5: ключевые различия, лучшие практики и варианты использованияPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 QThread msleep() и QTimer в PyQt5: ключевые различия, лучшие практики и варианты использования

Сообщение Anonymous »

Я работаю над приложением PyQt5, в котором мне нужно выполнять периодические задачи. Я столкнулся с двумя основными подходами:
  • Использование time.sleep() или QThread.msleep() в подклассе из QThread.
  • Использование QTimer.
PyQt5 документация рекомендует использовать QTimer для периодических задач вместо таких подходов к блокировке, как time.sleep() или QThread.msleep(). Однако я не уверен, что это всегда лучший вариант, особенно при работе внутри QThread.
Желаемый результат:
Я вам нужно масштабируемое, поточно-ориентированное решение для периодических задач в PyQt5. Я хотел бы понять:
  • Когда и почему выбирать QTimer вместо QThread.msleep() (или наоборот) .
  • Как правильно настроить и использовать QTimer внутри QThread.
Пример задачи: периодическая передача данных с камеры:
class MsleepWorker(QThread):
frame_ready = pyqtSignal(QImage)

def __init__(self, source=0):
super().__init__()
self.capture = cv2.VideoCapture(source)
self.running = True

def run(self):
while self.running:
ret, frame = self.capture.read()
if ret:
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
bytes_per_line = ch * w
qt_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
self.frame_ready.emit(qt_image)
self.msleep(33)

def stop(self):
self.running = False
self.quit()
self.wait()
self.capture.release()

class QTimerWorker(QThread):
frame_ready = pyqtSignal(QImage)

def __init__(self, source=0):
super().__init__()
self.capture = cv2.VideoCapture(source)

def start(self):
self.timer = QTimer()
self.timer.timeout.connect(self.read_frame)
self.timer.start(33)

def stop(self):
self.timer.stop()
self.capture.release()

def read_frame(self):
ret, frame = self.capture.read()
if ret:
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
bytes_per_line = ch * w
qt_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)
self.frame_ready.emit(qt_image)


Подробнее здесь: https://stackoverflow.com/questions/792 ... -and-use-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • QThread msleep() и QTimer в PyQt5: ключевые различия, лучшие практики и варианты использования
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Имеет ли смысл использовать Qthread, не вызывая QThread :: start ()?
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Различия и лучшие практики для использования ViewModels в XML против JetPack Compose
    Anonymous » » в форуме Android
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • QTimer с лямбда-функцией Python работает с предыдущими данными
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Что делает QTimer::singleShot(0, object, SLOT(obj_slot()))?
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»