【问题标题】:How can I draw multiple real-time plots without using or blocking the main thread?如何在不使用或阻塞主线程的情况下绘制多个实时图?
【发布时间】:2017-03-04 07:28:23
【问题描述】:

如何使用主线程中运行的程序中的数据绘制两个实时更新的图?

我尝试在 PyQTGraph 中使用 QApplication 类,但 QApplication.exec() 函数会阻塞主程序执行,也不能在线程上运行。

这三个问题的答案可能会有所帮助:

1) 是否有另一个python可视化库/API不需要使用主线程来绘制对象但速度足以绘制实时绘图?

2) 使用 Python 的多处理功能如何做到这一点?我刚刚学会了线程,所以多处理似乎令人生畏。在主程序和另一个处理更新图之间传递数据需要哪些代码行?

3) 多处理是否足够快,可以在一个进程中从主进程更新实时绘图?

非常感谢您提前提供的任何帮助。

【问题讨论】:

  • 多处理是您唯一的选择。是否足够快取决于(您的绘图数据的)数据速率、您想要一次显示多少个点、您想要更新图表的频率以及您的 PC 的速度。如果我没记错的话,pyqtgraph 内置了多处理支持。我认为它在示例应用程序中的一个示例中得到了证明。
  • 我应该详细说明,多处理是您唯一的选择,因为 Python GIL 确保一次只运行一个线程。无论如何,所有基于 Qt 的图形库都必须在主线程中绘制。
  • 感谢您的回复。它证实了我必须使用多处理的预感。除非有更简单的方法,否则我计划使用套接字进行进程间通信。
  • 套接字(python 原始套接字或 pyzmq)可以工作。如果您不希望套接字通信减慢主进程的速度,zmq pub/sub 套接字可能是一个不错的选择。或者,python 多处理库有一个队列对象可以做到这一点。同一个库中可能还支持共享内存(尽管您的里程可能因平台而异)

标签: python matplotlib multiprocessing real-time pyqtgraph


【解决方案1】:

这是 PyQt 特有的,因为它是线程安全的 . 所以尝试用例如启动另一个线程。 openvc 模块进行第二次绘图

import threading
threading.Timer(2, self.some_opencvplotfunction).start() #start every 2 sec

您可能在 opencv 函数中使用主应用程序中的任何 pyqt 功能,因为这会导致运行时错误

另一种方法是使用 matplotlib 并实例化一个或多个子图! 然后将您的 matplotlib 对象绑定到您的 PyQT GUI 中,例如:

if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        app.setStyle(QStyleFactory.create("Windows"))
        Dialog = QtGui.QDialog()
        ui = MAIN()
        ui.setupUi(Dialog) 

在你的主课中

    ui.figure, ui.axis = plt.subplots(figsize=(7.6, 6.1))
    ui.canvas = FigureCanvas(ui.figure)
    scene.addWidget(ui.canvas)

您可以在您的 gui 中添加尽可能多的子批次,只要您的 cpu 能够处理...

【讨论】:

  • 这很有启发性。谢谢。
  • @mago3421 如果您觉得这很有用,为什么不点赞或标记为好答案?这么客气,我需要代表点
  • 我是新手,所以我的更新不可见,但我投了赞成票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2017-05-02
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多