情节冻结因为快速输入流的GNU无线电块(Plot freezing because of fast

2019-10-23 12:27发布

我实现了一个sync block其内部图表work使用功能input_items值。 现在的问题是,绘制机制不是输入流(价值足够快input_items不断变化)。

我试图简化代码,尽可能并添加注释。 这里是:

....
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太快了(如果我改变它慢慢地它工作正常)。 任何建议? 我是新来的。

Answer 1:

举另一个答案我给:

这将很快也得到了多线程问题。 需要明确的是:你正在试图做什么(调用来自块线程绘图功能)是有问题的,通常是行不通的。

问题是,你在一个复杂的多线程环境中工作:

  • 每个GNU无线电块的工作在自己的线程
  • 该WX桂主循环运行的汽车无更新屏幕。

你在做什么在这里,从GNU无线电块线程,什么是显示在窗口中改变。 这是一件坏事,因为它改变的事情是在WX GUI线程的上下文。 这可以工作,如果这些变化不冲突,如果当你改变它(在某些点上WX GUI线程不访问这种数据,它必须访问它-否则,没有人会更新窗口)。

这是常见的各类更新图形用户界面的问题,不仅要GNU收音机!

无论发生的概率仅为情况:随着缓慢更新的显示,您的冲突的可能性非常低,但是当你更新的时候,它接近1。

现有的可视化是用C ++编写,并采取非常非常谨慎,做事情的正确方法 - 这就是,让你的GUI工具包(WX你的情况,虽然我明确地建议,并已建议,以从移开)知道事情需要更新,然后提供WX的功能来更新自己的线程的显示。



文章来源: Plot freezing because of fast input stream to a GNU Radio block