Planet Python на русском
Подписаться
GUI на Python: Исправление сбоев при использовании массивов NumPy с QImage в потоках Qt — Как безопасно передавать данные изображения между потоками при потоковой передаче видео или обновлении дисплеев
Сбои в многопоточном видеостримере, использующем NumPy и PyQt6, часто возникают из-за того, как QImage взаимодействует с памятью массива NumPy. Когда QImage создается из массива NumPy, он не копирует данные, а ссылается на исходный буфер памяти. Это создает опасную ситуацию в многопоточных приложениях, поскольку если рабочий поток изменяет или отбрасывает массив NumPy, QImage в потоке GUI может стать недействительным, что приведет к сбоям. Решение состоит в том, чтобы гарантировать, что QImage имеет свою собственную независимую копию данных. Это достигается путем вызова метода .copy() для QImage. Время выполнения этого копирования имеет решающее значение; оно должно быть выполнено до того, как QImage будет передан из рабочего потока в поток GUI, обычно перед его отправкой через сигнал. Кроме того, все обновления GUI, такие как вызов setPixmap, должны происходить исключительно в основном потоке. Использование сигналов и слотов — это правильный способ взаимодействия рабочих потоков с основным потоком для обновлений GUI. Предоставленный пример демонстрирует это, создавая QImage из массива NumPy, немедленно копируя его, а затем отправляя скопированный QImage через сигнал. Слот в основном потоке получает этот безопасный QImage, преобразует его в QPixmap и обновляет QLabel без сбоев. Внедряя эти практики, можно добиться надежной многопоточной потоковой передачи видео с помощью PyQt6.