You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统Python实时绘制传感器数据卡顿问题技术咨询

卡顿根本原因

你遇到的卡顿和绘图库无关,核心问题是time.sleep(10)直接阻塞了Qt的主事件循环:PyQtGraph基于Qt框架运行,界面的拖动、缩放、重绘等所有交互都依赖主线程的事件循环处理,调用sleep时主线程会被完全挂起10秒,期间所有界面事件都无法响应,自然会出现卡顿。

最优解决方案(无需多线程)

直接使用Qt原生的QTimer异步定时器替代手写for循环+sleep的逻辑,定时器等待触发的过程不会阻塞事件循环,界面可以正常响应用户操作,同时完全满足你每10秒采集一次数据的需求。

优化后的可运行代码
import pyqtgraph as pg
import numpy as np
import time
from pyqtgraph.Qt import QtCore

t0 = time.time()

# 初始化Qt应用和绘图界面
app = pg.mkQApp()
win = pg.GraphicsLayoutWidget(show=True)
p1 = win.addPlot()
# 提前创建曲线实例,后续仅更新数据即可,无需每次清空重绘
curve = p1.plot()

x = []
y = []
sample_count = 0
MAX_SAMPLE = 100

def sample_and_update():
    global sample_count
    # 执行打印、数据采集逻辑
    print(f'i = {sample_count},  t = {time.time()-t0} s')
    x.append(sample_count)
    y.append(sample_count + sample_count * np.random.rand())
    # 更新曲线数据
    curve.setData(x, y)
    sample_count += 1
    # 采集满100次后停止定时器
    if sample_count >= MAX_SAMPLE:
        timer.stop()

# 初始化定时器,每10秒触发一次采集更新逻辑
timer = QtCore.QTimer()
timer.timeout.connect(sample_and_update)
timer.start(10000) # 单位为毫秒,10000对应10秒

# 启动Qt主事件循环
if __name__ == '__main__':
    app.exec_()
核心问题解答
  • 如何避免实时数据绘图场景下的界面卡顿问题?

    1. 禁止在GUI主线程执行阻塞操作:不要用time.sleep、死循环等会挂起主线程的逻辑,所有定时任务使用GUI框架自带的异步定时器实现,等待定时触发的过程中主线程可以正常处理界面交互事件。
    2. 优化绘图逻辑:不要每次清空画布重绘所有元素,提前创建绘图实例,更新时仅修改数据属性,大幅降低渲染开销。
    3. 优化数据存储逻辑:避免使用np.append这类每次调用都会重新分配内存的操作,改用预分配数组或者原生list存储数据,降低内存操作开销。
  • 是否存在更简单直接的实时绘图实现方案,可同时支持后台打印信息等其他进程运行?
    上述QTimer方案就是最简单的原生实现,无需引入多线程、多进程,也不需要额外依赖,定时触发的回调函数中可以同时执行日志打印、数据运算、绘图更新等所有操作,全程不会影响界面响应。如果后续有耗时较长的数值计算需求,可以搭配Qt的QThread把计算逻辑放到子线程执行,计算完成后通过信号槽把结果传回主线程更新界面即可,没有线程安全风险。

内容的提问来源于stack exchange,提问作者Ethan S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:36:03