Python GUI:在使用 NumPy 数组与 QImage 于 Qt 线程中时修复崩溃——如何在流式传输视频或更新显示时安全地在线程间传递图像数据
在多线程视频流处理器中使用 NumPy 和 PyQt6 时,崩溃通常源于 QImage 与 NumPy 数组内存的交互方式。当从 NumPy 数组创建 QImage 时,它不会复制数据,而是引用原始内存缓冲区。这在多线程应用中会形成危险情况:如果工作线程修改或丢弃了 NumPy 数组,GUI 线程中的 QImage 可能变为无效,从而导致崩溃。解决方案是确保 QImage 拥有其自身独立的数据副本。这通过调用 QImage 的 .copy() 方法实现。该复制操作的时机至关重要:必须在 QImage 从工作线程传递到 GUI 线程之前执行,通常是在通过信号发出之前。此外,所有 GUI 更新(例如调用 setPixmap)必须 exclusively 在主线程中进行。使用信号和槽是工作线程与主线程进行 GUI 更新的正确方式。所提供的示例演示了这一过程:从 NumPy 数组创建 QImage,立即对其进行复制,然后通过信号发出该已复制的 QImage。主线程上的槽函数接收此安全的 QImage,将其转换为 QPixmap,并更新 QLabel 而不会引发崩溃。通过实施这些实践,可以实现可靠的 PyQt6 多线程视频流。