2016-10-21 5 views
0

어떻게하면 메인 스레드에서 실행중인 프로그램의 데이터를 사용하여 실시간으로 업데이트되는 두 개의 플롯을 그릴 수 있습니까?메인 스레드를 사용하거나 블로킹하지 않고 어떻게 여러 개의 실시간 플롯을 그릴 수 있습니까?

나는 PyQTGraph의 QApplication 클래스를 사용하려고하지만 QApplication.exec() 기능 블록 메인 프로그램 실행도는 스레드에서 실행할 수 있습니다. 이 세 가지 질문에 대한

답변이 도움이 될 수 있습니다 :

1) 거기에 또 다른 파이썬 시각화 객체를 그릴 메인 스레드를 사용해야하지만, 실시간으로 그래프를 그릴 수있을만큼 빨리하지 않습니다/API 라이브러리?

2) 파이썬의 다중 처리 기능을 사용하면 어떻게 될까요? 방금 스레딩을 배웠으므로 다중 처리가 어렵습니다. 주 프로그램과 그래프를 업데이트하는 다른 처리간에 데이터를 전달하는 데 필요한 코드 줄은 무엇입니까?

3) 다중 프로세스는 주 프로세스에서 한 프로세스의 실시간 플롯을 업데이트 할만큼 충분히 빠릅니까?

사전에 도움을 주셔서 감사합니다.

+0

다중 처리가 유일한 옵션입니다. is가 빠름 여부는 데이터 속도 (플롯 데이터), 한 번에 표시 할 지점 수, 그래프 업데이트 빈도 및 PC 속도에 따라 다릅니다. pyqtgraph는 올바르게 기억한다면 다중 처리 지원을 내장하고 있습니다. 예제 애플리케이션의 예제 중 하나에서 시연 된 것 같습니다. –

+0

파이썬 길 (GIL)은 한 번에 하나의 스레드 만 실행하도록 보장하기 때문에 멀티 프로세싱이 유일한 옵션입니다. 그리고 모든 Qt 기반의 그래프 라이브러리는 어쨌든 주 스레드에 그려야합니다. –

+0

응답 해 주셔서 감사합니다. 그것은 다중 처리를 사용해야한다는 나의 직감을 확인합니다. 더 쉬운 방법이 없다면 프로세스 간 통신을 위해 소켓을 사용할 계획입니다. – mago3421

답변

1

이것은 스레드 안전성을 목표로하기 때문에 PyQt 고유입니다. . 예를 들어 다른 스레드를 시작하십시오. 이

또 다른 방법은하기 matplotlib를 사용하여 인스턴스화하는 런타임 오류가 발생으로 openvc 모듈은 OpenCV의 기능에 기본 응용 프로그램에서 어떤 PyQt는 기능을 사용하지

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

와 두 번째 플롯을 수행하는 하나 이상의 서브 플로트!

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

하고 CPU가 처리 할 수있는 당신이 당신의 GUI에 많은 sublots을 추가 할 수 있습니다

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

메인 클래스 : 다음처럼 PyQt는 GUI로하기 matplotlib 객체를 바인딩합니다. ..

+1

이것은 계몽적입니다. 고맙습니다. – mago3421

+0

@ mago3421이 유용한 이유가 없다면 왜 upvote 나 좋은 대답으로 표시 할 수 있습니까?매우 친절 하네, 나는 rep 지점이 필요하다 –

+0

내 업데이 트가 보이지 않을 정도로 나는 초보자이다. 그러나 나는 upvote를했다. – mago3421