2017-05-04 6 views
0

私は、ボタンがクリックされたときにスレッドを起動し、SPIを介してデータを取得し始めるビーグルボーンブラックのGUIに取り組んでいます。pyqtgraphのGUIは決してリフレッシュされません

この関数はScanner(QObject)というクラスの内部にあり、[開始]ボタンをクリックすると別のスレッドで実行されます。

def scan (self): 
    thread_name = QThread.currentThread().objectName() 
    self.sig_msg.emit('Scanning '+thread_name) 
    for step in range(nsamples): 
     data = self.read_reg(reg[thread_name]) 
     self.sig_data.emit(step, data) 
     QThread.currentThread().msleep(50) 
     app.processEvents() 
     if self.__abort: 
      self.sig_msg.emit('scan stopped by user') 
      break 
    self.sig_done.emit(thread_name) 

sig_msgはGUIスレッド内の次の関数に接続されたpyqtsignalです。

@pyqtSlot(int, int) 
def on_scaner_data(self, t: int, y: int): 
    app.processEvents() 
    self.debugBox.insertPlainText('t: '+str(t)+'y: '+str(y)+'\n') 
    self.debugBox.ensureCursorVisible() 
    self.MainGraph.update_fig(t,y) 

最後に、MainGraph.update_fig()が呼び出されます。その関数の中で私はグラフを更新するためにsetData(self.datat、self.datay)とapp.processEvents()を使用しましたが、何も変わりません。 plot(self.datat、self.datay)を実行するとグラフが再描画されますが、パフォーマンスが大幅に低下します。

class DynamicPlotter(PlotWidget): 
def __init__(self,parent=None): 
    PlotWidget.__init__(self) 
    self.setParent(parent) 
    # Use getPlotItem() to get the PlotItem inside PlotWidget. 
    self.pitem = self.getPlotItem() 
    #now pitem is our PlotItem 
    self.pitem.curve=self.pitem.plot() 
    #curve is a new PlotDataItem added by PlotItem.plot() 
    self.datat = [1,2] 
    self.datay = [1,2] 
    self.pitem.curve.setData(self.datat,self.datay) 
    #this graph works fine 
    self.datat = [] 
    self.datay = []   
def update_fig(self,t:int,y:int):  
    self.datat.append(t) 
    self.datay.append(y) 
    #it works 
    self.pitem.curve=self.pitem.plot(self.datat,self.datay) 
    #it doesn't 
    self.pitem.curve.setData(self.datat,self.datay) 
    app.processEvents() 
    print (self.datat) 
    log.debug(str(t)+str(y)) 
def reset_figure(self): 
    log.debug('clean graph') 
    self.clear() 

私はpyqtplotのこの例に従っており、私の考えは私のGUIの中で似たようなことをしています。

import initExample 
    from pyqtgraph.Qt import QtGui, QtCore 
    import numpy as np 
    import pyqtgraph as pg 
    from pyqtgraph.ptime import time 
    app = QtGui.QApplication([]) 
    p = pg.plot() 
    p.setWindowTitle('pyqtgraph example: PlotSpeedTest') 
    p.setRange(QtCore.QRectF(0, -10, 5000, 20)) 
    p.setLabel('bottom', 'Index', units='B') 
    curve = p.plot() 
    data = np.random.normal(size=(50,5000)) 
    ptr = 0 
    lastTime = time() 
    fps = None 
    def update(): 
     global curve, data, ptr, p, lastTime, fps 
     curve.setData(data[ptr%10]) 
     ptr += 1 
     now = time() 
     dt = now - lastTime 
     lastTime = now 
     if fps is None: 
      fps = 1.0/dt 
     else: 
      s = np.clip(dt*3., 0, 1) 
      fps = fps * (1-s) + (1.0/dt) * s 
     p.setTitle('%0.2f fps' % fps) 
     app.processEvents() ## force complete redraw 
    timer = QtCore.QTimer() 
    timer.timeout.connect(update) 
    timer.start(0) 

私はドキュメントを読んでいて、どこに問題があるのか​​わかりません。私はスレッドまたはイベントループハンドラーのために賭けるが、私は知らない。 レビューする必要がある重要なポイントはどれですか? 手掛かりはありますか?

ありがとうございます。

+0

あなたの投稿に 'pyqtgraph'タグを追加することをお勧めします。私は自分でやっていますが、別のタグを削除する必要があります(最大5つのタグを持つことができます)。 – titusjan

答えて

1

しばらくして、自分で問題を発見しました。 グラフをリセットして要素がプロットされるまでスキャンスレッドを停止する方法を変更する問題を修正しました。

リセット機能の変更。 self.clear()は、PlotWidgetのトレースを削除します。これは、必要なものではありませんでした。

データが他のスレッドにプロットされている間にスキャンが修正されました。 sync_to_plotは、self._wait = Falseになるまでスレッドの実行を停止します。この値はwait_stateによって変更されます。その行われ、最後の変更に伴い

def scan (self): 
    thread_name = QThread.currentThread().objectName() 
    #thread_id = str(QThread.currentThreadId())#review 
    self.sig_msg.emit('Scanning '+thread_name) 
    for step in range(nsamples): 
     data = self.read_reg(reg[thread_name]) 
     self.sig_data.emit(step, data) 
     #pause while plot values 
     self.sync_to_plot() 
     if step % refrate == 0: 
      log.debug("%5d : %d" % (step, data)) 
     if self.__abort: 
      self.sig_msg.emit('scan stoped by user') 
      break 
    self.sig_done.emit(thread_name) 

def sync_to_plot(self): 
    self._wait=True 
    while self._wait: 
     log.debug("waiting") 
     QThread.currentThread().msleep(1) 
     app.processEvents() 
def wait_state(self, stat): 
    self._wait=stat 

はsync_to_plotに待機しているスレッドのブロックを解除on_scaner_dataにありました。

@pyqtSlot(int, int) 
def on_scaner_data(self, t: int, y: int): 
    app.processEvents() 
    self.debugBox.insertPlainText('t: '+str(t)+'y: '+str(y)+'\n') 
    self.debugBox.ensureCursorVisible() 
    self.MainGraph.update_fig(t,y) 
    for thread, scaner in self.__threads: 
     scaner.wait_state(False) 
     log.debug("scanner false") 
関連する問題