Einfrieren wegen des schnellen Eingangsstroms zu einem GNU Funkblock

Ich habe einen sync block implementiert sync block der in seiner work mit den input_items Werten input_items . Nun ist das Problem, dass der Plot-Mechanismus nicht schnell genug für den Eingangsstrom ist (der Wert von input_items hält sich weiter).

Ich habe versucht, den Code so viel wie möglich zu vereinfachen und Kommentare hinzuzufügen. Hier ist es:

  • Ist es möglich, auf die Variable der Arbeitsfunktion in __init__ eines GNU-Funkblocks zuzugreifen?
  • Wie genau ist das Verhalten von hier_block anders als bei einem sync_block in GNU Radio?
  • Gnuradio `ImportError undefined symbol`
  • .bin zu .cfile flowgraph für GRC 3.7.2.1
  • Wie importiere ich Module in pycharm?
  • So testen Sie Quellblöcke in gnuradio
  •  .... 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() 

    Wie du sehen kannst Ich arbeite mit wxPython aber das Panel friert, wenn ich den Wert von input_items zu schnell ändern (es funktioniert gut, wenn ich es langsam ändern). Irgendwelche Empfehlungen? Ich bin neu hier.

  • Python3-Teilprozeß kommunizieren Beispiel
  • Kommunizieren Sie mehrmals mit einem Prozess, ohne das Rohr zu brechen?
  • Wie verwende ich subprocess.Popen, um mehrere Prozesse mit Pipes zu verbinden?
  • Verwenden von Pythons Unterprozeß zur Ausgabe der Ausgabe im neuen Xterm-Fenster
  • Wie bekomme ich Daten aus der Befehlszeile aus einem Python-Programm?
  • Lesen von Stdout aus xinput Test in Python
  • One Solution collect form web for “Einfrieren wegen des schnellen Eingangsstroms zu einem GNU Funkblock”

    Um eine andere Antwort zu nennen , gab ich:

    Dies wird schnell auch ein Multithreading-Problem. Um klar zu sein: Was du versuchst zu tun (nennen Sie eine Plot-Funktion aus einem Block-Thread) ist problematisch und funktioniert normalerweise nicht.

    Das Problem ist, dass Sie in einer komplexen Multithreading-Umgebung arbeiten:

    • Jeder GNU Funkblock arbeitet in seinem eigenen Thread
    • Die WX Gui Hauptschleife läuft kontinuierlich, um den Bildschirm zu aktualisieren.

    Was du hier machst, ändert sich aus einem GNU-Radio-Block-Thread, was im Fenster angezeigt wird. Das ist eine schlechte Sache, denn es ändert die Dinge, die im Kontext des WX-Gui-Threads sind. Dies kann funktionieren, wenn diese Änderungen nicht in Konflikt stehen und wenn der WX-Gui-Thread nicht auf diese Art von Daten zugreift, während du ihn änderst (irgendwann muss er darauf zugreifen – sonst wird noch niemand aktualisiert Fenster).

    Dies ist ein Problem gemeinsam für alle Arten von aktualisierten GUIs, nicht nur für GNU Radio!

    Ob dies geschieht, ist ein bloßer Fall der Wahrscheinlichkeit: Mit einer langsam aktualisierten Anzeige ist Ihre Konfliktwahrscheinlichkeit gering, aber wenn man sie oft aktualisiert, nähert sich 1.

    Die vorhandenen Visualisierungen sind in C ++ geschrieben und nehmen sehr große Sorge, um die Dinge richtig zu machen – das ist, lassen Sie Ihr Gui Toolkit (WX in Ihrem Fall, obwohl ich explizit empfehlen und empfohlen haben, sich davon zu entfernen) wissen das Dinge müssen aktualisiert werden, und dann bietet WX eine Funktion, um das Display in seinem eigenen Thread zu aktualisieren.

    Python ist die beste Programmiersprache der Welt.