2016-03-21 29 views
0

私は、多数のサンプル(最大4e6サンプル)で信号をプロットする必要があります。私はPython 2.7、Qt 4.8、pyqtgraph 0.9.10を使用しています。scypy.signal.decimate()フリーズGUI

私はこのようなものでした:

  1. 信号を生成し、それらを間引く(別のQThread中)
  2. プロット信号をと(pyqtgraphの方法)
setDownsample()とclipToView()を呼び出し

デシジョンのためのQThreadが計算されるとき、GUIがフリーズします。ここに私のコードは次のとおりです。計算とデシメーションのため

class TestDecimate(QDialog): 

    def __init__(self, parent=None): 
     super(TestDecimate, self).__init__(parent) 

     self.decimate_thread = GenerateBigPlotThread() 

     layout = QGridLayout() 

     graph_widget = pg.GraphicsLayoutWidget() 
     graph_layout = graph_widget.addLayout() 

     self.p = graph_layout.addPlot(title="Plot 2", col=1, row=2) 
     self.curve1 = self.p.plot([], pen=(255, 0, 0)) 
     self.curve2 = self.p.plot([], pen=(255, 255, 0)) 
     self.curve3 = self.p.plot([], pen=(255, 0, 255)) 
     self.curve4 = self.p.plot([], pen=(0, 0, 255)) 
     self.p.showGrid(True, True, 0.3) 

     self.legend = pg.LegendItem(offset=(-10,10)) 
     self.legend.addItem(self.curve1, name="Test") 
     self.legend.addItem(self.curve2, name="Test1") 
     self.legend.addItem(self.curve3, name="Test2") 
     self.legend.addItem(self.curve4, name="Test3") 
     self.legend.setParentItem(self.p.getViewBox()) 

     self.start_pb = QPushButton("Generate") 

     layout.addWidget(graph_widget, 1, 1) 
     layout.addWidget(self.start_pb, 2, 1) 

     self.setLayout(layout) 

     self.start_pb.clicked.connect(self.start_thread_for_decimate) 
     self.decimate_thread.newData.connect(self.set_data) 

    def set_data(self, y, z, n, m): 
     print "Plotting" 
     self.curve1.setData(y) 
     self.curve2.setData(z) 
     self.curve3.setData(n) 
     self.curve4.setData(m) 

     self.p.setDownsampling(ds=True, auto=True, mode='peak') 
     self.p.setClipToView(clip=True) 
     self.p.getViewBox().enableAutoRange(axis=ViewBox.XYAxes) 
     print "Plotting done" 


    def start_thread_for_decimate(self): 
     self.decimate_thread.start() 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    main = TestDecimate() 
    main.show() 
    sys.exit(app.exec_()) 

スレッド:スレッドが開始されると

class GenerateBigPlotThread(QThread): 

    newData = QtCore.pyqtSignal("PyQt_PyObject","PyQt_PyObject","PyQt_PyObject","PyQt_PyObject") 

    def __init__(self,*arg,**kwargs): 
     super(GenerateBigPlotThread, self).__init__(*arg,**kwargs) 

    def run(self): 

     self.num_points = 4e6 

     x = np.arange(self.num_points) 
     y = np.sin(3.14159 * x * 10/self.num_points) 
     z = np.cos(3.14159 * x * 10/self.num_points) 
     n = np.sin(3.14159 * x * 5/self.num_points) 
     m = np.cos(3.14159 * x * 5/self.num_points) 
     print "Decimate" 
     y = decimate(y, 4, ftype='fir') 
     z = decimate(z, 4, ftype='fir') 
     n = decimate(n, 4, ftype='fir') 
     m = decimate(m, 4, ftype='fir') 
     print "Done!" 

     self.newData.emit(y, z, n, m) 

問題を確認する最良の方法は、凡例を移動することです。 また、デシメートの代わりにscipy.signal.resample(4e6サンプル~1e6サンプル)を試しました。同じ問題が発生しました。 誰かがこの種の行動の理由を教えてもらえますか?

答えて

0

問題はscipyのバージョンにありました。私はscipy 0.13.2を持っていて、0.17.0にアップグレードした後、問題は解決するようです。それでも、なぜこのようなものが最初に可能であったのかを知りたいです。

関連する問題