2015-06-26 86 views
1

我已經實現了一個sync block,該函數在其work函數內使用input_items值進行繪製。現在問題在於繪圖機制對於輸入流不夠快(input_items的值不斷變化)。由於快速輸入流而凍結成GNU Radio塊

我試圖儘可能簡化代碼並添加註釋。那就是:

.... 
import matplotlib 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas 
from matplotlib.backends.backend_wx import NavigationToolbar2Wx 
from matplotlib.figure import Figure 
temp = '' 
class xyz(gr.sync_block): 
    def __init__(self,parent,title,order): 
     a = [] 
     self.count = 1 
     gr.sync_block.__init__(self, 
       name="xyz", 
       in_sig=[numpy.float32,numpy.float32], 
       out_sig=None) 
     self.win = xyzPlot(parent) #I have a Top Block(wxFrame). I am just making it the parent of xyzPlot(wxPanel) here. 

    def work(self, input_items, output_items): 
     global temp 
     if (self.count == 1): 
      temp = input_items+list() 
     bool = not(np.allclose(temp,input_items))#bool will be true if the value of `input_items` changes. 
     ....... 
     #the code that evaluates z1,z2 depending on the value of input_items  
     ....... 
     if (bool or self.count == 1): 
     #If bool is true or it is the first time then I am calling plot() which plots the graph. 
      self.win.plot(tf(self.z1,self.z3),None,True,True,True,True) 
     self.count = 0 
     temp = input_items+list() 
     return len(input_items[0]) 

class xyzPlot(wx.Panel): 
    def __init__(self, parent, dB=None, Hz=None, deg=None): 
     wx.Panel.__init__(self , parent , -1 ,size=(600,475)) 
     self.fig = Figure() 
     self.axes = self.fig.add_subplot(111) 

    def plot(self, syslist, omega=None, dB=None, Hz=None, deg=None, Plot=True, *args , **kwargs): 
     self.axes.clear() #I clear the graph here so that new values can be plotted. 
     ..... 
     self.axes.semilogx(omega,mag,*args,**kwargs) 
     self.canvas = FigCanvas(self, -1, self.fig) 
     self.canvas.draw() 

正如你可以看到我與wxPython的工作,但每當我改變input_items太快(如果我改變它慢慢地它工作正常)的值面板凍結。任何建議?我是新來的。

+0

請勿清除軸並重建藝術家。創建一次,並保留一個參考。然後你可以使用'set_data'來只改變數據點。畫布同樣適用。只創建一次,然後調用'draw'應該足以更新數字。 – hitzg

+0

@hitzg:的確如此,但問題似乎在於他是異步的,並且以高速率繪製不是GUI線程的線程中的東西。我想你可能會更好地習慣matplotlib/wx集成,所以我很想看到你的評論在我的[答](http://stackoverflow.com/a/31068633/4433386)。 –

+0

@MarcusMüllerꕺꕺ不是。我的評論僅僅是關於如何加快劇情更新的建議。 – hitzg

回答

1

another answer我放棄:

這將很快也得到了多線程問題。要清楚:你試圖做什麼 (從塊線程調用繪圖功能)是 有問題,並且通常不起作用。

的問題是,你在一個複雜的多線程環境中工作:

  • 各自在自己的線程
  • GNU無線電塊的工作的WX桂主循環運行的汽車無更新屏幕。

你在這裏做的是,從GNU無線電塊的線程,改變窗口中顯示的內容。這是一件壞事,因爲它改變了WX Gui線程環境中的東西。這可以工作,如果這些變化不衝突,並且如果WX桂線程不改變它時訪問這種類型的數據(在某些時候,它必須訪問它 - 否則,沒有人會更新你的窗口)。

這是所有更新的圖形用戶界面常見的一個問題,不僅限於GNU Radio!

無論發生的概率僅爲情況:隨着緩慢更新的顯示,您衝突的可能性非常低,但是當更新的時候,它接近1

現有的可視化是用C++並非常謹慎地以正確的方式做事 - 也就是說,讓你的GUI工具包(WX在你的案例中,雖然我明確建議,並建議,擺脫這一點)知道需要更新的東西,並且然後向WX提供一個函數來更新它自己的線程中的顯示。

+0

感謝您的回答。有沒有關於如何爲樣本提供現有可視化工具的教程?你能指導我給他們或文件執行類似的事情,所以我可以通過代碼? – PuRaK

+0

@PuRaK:指導教程是你的朋友。你只是流入樣本。源代碼公開可用,http://github.com/gnuradio/gnuradio。看看gr-qtgui/lib(或者如果你真的想這樣做,不要那麼做,WX已經死了,gr-wxgui)文件夾。 –