"Keine Rückmeldung"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Hallo,
meine Anwendung (Python Script mit wx-Oberfläche als exe-Datei) startet auf Knopfdrück zahlreiche http-requests (10 und mehr), und liefert anschließend das Ergebnis zurück.
Soweit funktioniert alles.
Was mich aber stört: während die Abfragen (http-requests) im Hintergrund laufen, zeigt das Frontend (also die grafische Benutzeroberfläche) in der Titelleiste die Meldung "keine Rückmeldung".
Eigentlich möchte ich nach jeder erfolgreichen http-Abfrage im Frontend einen Zwischenstatus einblenden. Sobald aber ""keine Rückmeldung" erscheint, hängt das komplette Frontend.
Gibt es für mein Problem eine Lösung?
Vielen Dank!
Benutzeravatar
noisefloor
User
Beiträge: 3858
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie setzt du die Requests denn ab? Nach deiner Beschreibung zu urteilen blockierst du dir selber den Mainloop der GUI.

Zeig' doch mal die relevanten Codeabschnitte.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Also letztlich stimmt die Annahme/Aussage „während die Abfragen (http-requests) im Hintergrund laufen“ nicht, denn die laufen offenbar nicht im Hintergrund.

Also sollten sie das tun, per Threading oder als Prozesse mit `threading`, `multiprocessing`, oder `concurrent.futures`: Dran denken, dass die GUI nur aus dem GUI-Thread heraus geändert werden darf. Die beiden threadsicheren Varianten dafür in wxWidgets sind `wx.CallAfter()` und `wx.PostEvent()`, je nach dem ob einem einfache Aufrufe reichen, oder ob man einen eigenen Ereignistyp für die GUI-Hauptschleife basteln will.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

noisefloor hat geschrieben: Mittwoch 8. Juni 2022, 11:07 Hallo,

wie setzt du die Requests denn ab? Nach deiner Beschreibung zu urteilen blockierst du dir selber den Mainloop der GUI.

Gruß, noisefloor
Soweit hatte ich gar nicht gedacht.

Mein abschließender Code sieht wie folgt aus:

Code: Alles auswählen

abc = wx.App()
meinObjekt = MeineKlasse(None, title='Das bin ich')
abc.MainLoop()
Innerhalb von "meinObjekt" gibt es eine Methode, die die http-Requests mittels for-Schleife nacheinander ausführt.
D.h. solange die for-Schleife läuft, wird Mainloop blockiert.
Ich stehe jetzt aber trotzdem auf den Schlauch.
Wie kann ich außerhalb von Mainloop die Methode aufrufen, und das Ergebnis dann innerhalb von Mainloop zurückspielen?
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Naja `threading` oder `multiprocessing` oder `concurrent.futures` und `wx.CallAfter()` oder `wx.PostEvent()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3858
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wie kann ich außerhalb von Mainloop die Methode aufrufen, und das Ergebnis dann innerhalb von Mainloop zurückspielen?
Z.B. indem du die HTTP Request in separate Threads auslagerst, deren Ergebnis in eine Queue schreibst und die Queue periodisch im Mainloop abfragst. Geht alles mit Bordmitteln von Python und den Methoden von wx, siehe Post von __blackjack__.

Wenn du nicht weiter kommst -> zeig' am besten mal den Code, den du probier hast, dann kann man konkreter Helfen / Tipps geben.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Queue und periodisch Abfragen braucht man bei `wx` nicht. Die beiden Funktionen die ich genannt habe sind threadsicher und bei `wx.PostEvent()` würde man einfach die Ereignis-Queue von `wx` mitbenutzen und kann da Listener für das eigene Ereignis registrieren. Ist aber eventuell auch schon zu kompliziert gedacht wenn man mit einem Aufruf auskommen kann, den man mit `wx.CallAfter()` macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten