2014-06-20 3 views
0

나는 두 개의 프로그램을 파이썬으로 가지고있다. Prog1.py와 Prog2.py라고 부르 자. Prog1을 통해 외부 장치에서 실시간 데이터를 얻을 수 있습니다. 현재로서는 데이터를 가져올 때 화면에 인쇄합니다. 각 반복마다 획득 한 새로운 데이터 세트가 인쇄되는 while 루프가 실행됩니다. 이제 Prog2는 PyQtGraph를 사용하여 빌드 된 Python 프로그램으로, 모니터와 같이 실시간으로 데이터를 그릴 수 있습니다. 현재 Prog2는 (즉, 별도로 실행될 때) 이미 획득 한 데이터를 표시합니다. 이것은 움직이는 음모입니다. 따라서 Prog2.py에는 지정된 간격으로 타이머에 의해 반복적으로 호출되는 업데이트 함수가있어 그래프를 다음 데이터 요소로 업데이트 (오른쪽으로 이동)합니다. 제 목표는 Prog1과 Prog2를 연결하는 것입니다. Prog2가 실시간으로 수집 한 데이터를 Prog2로 파이프하여 Prog2가 실시간으로 데이터를 그릴 수 있도록하려는 것입니다.Python에서 이벤트 처리 프로그램 두 개 통합하기

Prog1과 Prog2는 자체 이벤트 루프 프로세스가있는 독립적 인 이벤트이므로이 이벤트를 연결하는 방법을 잘 모르겠습니다. 필자가 생각한 순진한 아이디어는 Prog1.py와 Prog2.py를 병렬로 실행하고 Prog1.py에게 파일에 데이터를 저장하도록 요청하고 Prog2.py에 읽어서 그래프를 그릴 것을 요청했습니다. 그러나 나는 이것으로 확신하지 못했습니다. 이것은 더러워 보입니다. 어떻게 든 Prog1.py 안에 Prog2.py 코드 전체를 실행하고 싶습니다. 이 작업을 수행 할 수있는 명확한 방법이 있습니까?

편집 - 코드

Prog1.py

/* 

Code to get data from USB 

*/ 

def main(): 
    while 1: 
     data = get_data() 
     print data 

main() 

Prog2.py 아마, 그래프를 업데이트하고

+1

당신은 아마 스레딩과 잘이 작업을 수행 할 수 있습니다. 한 스레드가 라이브 데이터에 대한 모든 과장을 수행하고 그래프를 수행하는 다른 스레드를 수행하게하십시오. 두 번째 스레드에 그래프를 업데이트 할 이벤트를 지정하고 첫 번째 스레드가 데이터 트리거를 잡아 이벤트를 트리거합니다. 만약 당신이 진술 한 것처럼 하나의 프로그램에서 그것을 원한다면 말입니다. https://docs.python.org/2/library/threading.html#event-objects – Bob

+0

또한 자체 이벤트 루프가있는 라이브러리 (Live555)와 내 Qt GUI를 결합 할 수있었습니다. 기본 스레딩 규칙을 존중하는 한 스레드로 쉽게 달성 할 수 있습니다. –

답변

1

당신에게 몇 가지 옵션을 스크롤하기 위해 타이머를 통해 PyQtGraph 코드입니다 그 중 어떤 것이 작동할까요 :

  1. 데이터를 모니터하고 플로팅을 위해 이것을 메인 쓰레드로 보냅니다. (참조 : https://groups.google.com/forum/#!msg/pyqtgraph/haiJsGhxTaQ/RkOov_UZEcYJ를)
  2. 는 단일 스레드 프로그램으로 프로그램에 참여, 새로운 데이터를 확인 타이머 및 replots에 데이터가 도착 때마다 :

    plt = pg.plot() 
    def update(): 
        data = getNewData() 
        if data is not None: 
         plt.plot(data, clear=True) 
    timer = QTimer() 
    timer.timeout.connect(update) 
    timer.start(10) 
    
  3. 별도의 프로그램을 유지하고 일부를 사용 IPC의 형태 - 소켓, 파이프 등. 이것은 데이터를 직렬화하는 것을 포함 할 것입니다 (아마도 피클을 사용하는 것이 좋습니다). pyqtgraph.multiprocess도 프로세스간에 Qt 신호를 보낼 수 있습니다. 이것은 아마도 가장 어려운 선택이지만, 여기에 쉬운 예제 :

    import pyqtgraph as pg 
    import pyqtgraph.multiprocess as mp 
    proc = mp.QtProcess() # start second process for plotting 
    rpg = proc._import('pyqtgraph') 
    plt = rpg.plot() # create a PlotWidget in remote process 
    
    # Unlike the last example, we can use a wile-loop here because the Qt 
    # event loop is running in another process. 
    while True: 
        data = getNewData() 
        if data is not None: 
         plt.plot(data, clear=True, _callSync='off') 
    
+0

두 번째 제안에서 getNewData()는 128의 주파수에서 수신중인 Prog1.py입니다 (초당 128 데이터 포인트를 얻음). 그것은 오는대로 데이터를 인쇄하는 별도의 루프를 가지고 있습니다. 귀하의 코드는 10ms 간격에서만 getNewData를 호출 할 것을 제안합니까? 미안하지만 좀 더 자세히 설명해 주실 수 있습니까? 더 명확하게 게시물을 편집했습니다. – user1955184

+0

물론 원하는 간격으로 타이머를 자유롭게 실행할 수 있습니다.이러한 제안 사항 중 어떤 것이 데이터 수집의 세부 사항에 달려 있는지 여부 (예 : 최대 간격으로 장치를 폴링해야합니까? 데이터를 삭제하기 전에 얼마나 오래 기다릴 수 있습니까?) 및 데이터를 그릴 때 시스템이. 타이머 (2)를 사용하는 것이 가장 쉽지만 드로잉으로 인해 데이터 수집에 오래 걸리는 지연이 발생하는 경우 병렬 방법 (1 또는 3)이 더 적합 할 수 있습니다. – Luke