- Использование time.sleep() или QThread.msleep() в подклассе из QThread.
- Использование QTimer.
Желаемый результат:
Я вам нужно масштабируемое, поточно-ориентированное решение для периодических задач в 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