16 Stimmen

Python/wxPython: Kontinuierliche Arbeit im Hintergrund

Ich mache ein Programm für die Ausführung von Simulationen in Python, mit einer wxPython-Schnittstelle. In dem Programm kann man eine Simulation erstellen, und das Programm rendert (=berechnet) sie für einen. Das Rendering kann manchmal sehr zeitaufwendig sein.

Wenn der Benutzer eine Simulation startet und einen Anfangszustand definiert, möchte ich, dass das Programm die Simulation kontinuierlich im Hintergrund rendert, während der Benutzer möglicherweise andere Dinge im Programm tut. So etwas wie eine YouTube-ähnliche Leiste, die sich füllt: Man kann die Simulation nur bis zu dem Punkt abspielen, der gerendert wurde.

Wie sollte ich die Rendering-Funktion ausführen?

10voto

FogleBird Punkte 69852

Ich würde eine threading.Thread um den Code im Hintergrund auszuführen und wx.CallAfter um Aktualisierungen in meinem Fenster-Thread zu posten, um sie dem Benutzer zu zeigen.

thread = threading.Thread(target=self.do_work)
thread.setDaemon(True)
thread.start()

...

def do_work(self):
    # processing code here
    while processing:
        # do stuff
        wx.CallAfter(self.update_view, args, kwargs)

def update_view(self, args):
    # do stuff with args
    # since wx.CallAfter was used, it's safe to do GUI stuff here

7voto

John Montgomery Punkte 8418

Es gibt eine ganze Reihe von Informationen auf der wxPython-Wiki über lang laufende Aufgaben die nützlich sein könnten. Sie verwenden grundsätzlich ein Gewinde und wx.PostEvent um die Kommunikation zwischen dem Thread und der Haupt-Wx-Ereignisschleife zu handhaben.

4voto

Chris Upchurch Punkte 14893

Starten Sie einen neuen Prozess zum Rendern im Hintergrund und prüfen Sie regelmäßig, ob er zurückgekehrt ist.

Die Dokumentation für das Subprozessmodul finden Sie unter aquí und das Multiprozessmodul aquí . Wie Jay sagte, ist Multiprozess wahrscheinlich besser, wenn Sie Python 2.6 verwenden. Das heißt, ich glaube nicht, dass es einen Leistungsunterschied zwischen den beiden gibt. Multiprocess scheint nur ein Wrapper um subprocess zu sein, der bestimmte Dinge einfacher macht.

Während Subprozess/Multiprozess der Standardweg ist, um dies zu tun, können Sie auch einen Blick werfen auf Parallele Python .

0voto

attwad Punkte 927

Wenn es Ihnen nichts ausmacht, einen etwas anderen Ansatz zu wählen, können Sie einen Blick auf stapellos python und erstellen Sie ein Tasklet für Ihren Rendering-Prozess. Ich persönlich finde es sehr einfach zu bedienen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X