多线程环境下 PyQtGraph 绘画解决方案

2024-03-05 15:28

本文主要是介绍多线程环境下 PyQtGraph 绘画解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们多线程编译并且使用PyQtGraph进行绘图时,我们需要确保所有的图形操作都在主线程中执行,主要是因为PyQtGraph是在主线程中创建的,并且不是线程安全的。下面我们将深入探讨在多线程环境下使用PyQtGraph绘图并做详细记录。

在这里插入图片描述

1、问题背景

在使用 PyQtGraph 绘图时,如果在主线程之外进行绘图操作,可能会出现绘图不生效或程序崩溃的问题。这是因为 PyQtGraph 的绘图操作需要在主线程中进行,否则可能会导致绘图操作与 GUI 界面更新操作冲突。

2、解决方案

为了解决这个问题,可以采用以下解决方案:

  1. 将绘图操作封装成一个函数,并将其放入一个队列中;

  2. 创建多个工作线程,并让每个工作线程从队列中获取绘图任务,然后在主线程中执行绘图操作;

  3. 通过信号和槽机制将工作线程和主线程连接起来,以便工作线程在完成绘图任务后通知主线程更新 GUI 界面。

以下是一个示例代码,演示了如何使用上述解决方案来在多线程环境下进行 PyQtGraph 绘图:

from PyQt5 import QtCore, QtWidgets
import pyqtgraph as pg
import threading
import Queue# 创建一个绘图对象
app = QtWidgets.QApplication([])
win = pg.GraphicsWindow(title="Basic plotting examples")
plot = win.addPlot(title="Simple plot", labels={'left': 'Y Axis', 'bottom': 'X Axis'})
curve = plot.plot(curve=np.random.normal(size=100))# 定义绘图函数
def draw(data):curve.setData(data)# 将绘图函数封装成一个类
class DrawingThread(threading.Thread):def __init__(self, queue):super(DrawingThread, self).__init__()self.queue = queuedef run(self):while True:# 从队列中获取绘图任务data = self.queue.get()# 在主线程中执行绘图操作QtCore.QMetaObject.invokeMethod(curve, "setData", QtCore.Qt.QueuedConnection,QtCore.Q_ARG(object, data))# 通知主线程更新 GUI 界面QtCore.QMetaObject.invokeMethod(app, "processEvents", QtCore.Qt.QueuedConnection)# 标记任务完成self.queue.task_done()# 创建一个队列来存储绘图任务
queue = Queue.Queue()# 创建多个工作线程
num_worker_threads = 3
for i in range(num_worker_threads):thread = DrawingThread(queue)thread.daemon = Truethread.start()# 将绘图任务放入队列中
for i in range(100):queue.put(np.random.normal(size=100))# 启动应用程序
app.exec_()

在这个示例中,我们创建了一个绘图对象 curve,并将其添加到 PyQtGraph 的绘图窗口中。然后,我们定义了一个绘图函数 draw(),这个函数将数据 data 绘制到 curve 上。

接下来,我们将绘图函数封装成一个类 DrawingThread。这个类继承自 threading.Thread,并重写了 run() 方法。在 run() 方法中,我们从队列中获取绘图任务,然后在主线程中执行绘图操作。

最后,我们创建了一个队列 queue 来存储绘图任务,并创建了多个工作线程来从队列中获取绘图任务并执行绘图操作。

在主线程中,我们通过信号和槽机制将工作线程和主线程连接起来,以便工作线程在完成绘图任务后通知主线程更新 GUI 界面。

通过这种方式,我们可以在多线程环境下进行 PyQtGraph 绘图,并且不会出现绘图不生效或程序崩溃的问题。

最重要的需要注意的是,虽然数据生成过程是在工作线程中进行的,但数据传输和绘图更新操作都是在主线程中执行的,以确保PyQtGraph的线程安全性。如果有更多问题可以留言探讨。

这篇关于多线程环境下 PyQtGraph 绘画解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/776957

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro