Script bricht ohne Fehlermeldung ab

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Neu111
User
Beiträge: 64
Registriert: Dienstag 10. März 2020, 19:02

Hallo,
in meinem Script sieht der Ablauf im Groben so aus:

- leeres wx.Grid-Fenster wird erstellt
- Datenabfrage über eine REST-Schnittstelle
- Ergebnis wird in die wx.Grid-Zellen geschrieben

Seitdem ich nun die Datenbankabfragen "parallel" über die Methode

Code: Alles auswählen

threading.Thread(target=self.meineFunktion, args=e).start()
durchführe, passiert es ab und an, dass mein Script OHNE Fehlermeldung abstürzt (das komplette wx.Grid-Fenster klappt einfach zu, keine Fehlerausgabe in der Visual Studio Code Konsole).

Ich stelle mir nun die Frage, wie ich mich an die wahre Fehlerursache herantasten kann, wenn keine Fehlermeldung zurückgegeben wird und somit ein Hinweis fehlt?!

Und wie gesagt, dass Problem existiert nicht immer. Manchmal laufen die 20 REST-Anfragen ohne Probleme durch, manchmal stürzt das Script nach der 3. Anfrage ab, manchmal nach der 7. usw. .... also völlig willkürrlich.
Benutzeravatar
sparrow
User
Beiträge: 3563
Registriert: Freitag 17. April 2009, 10:28

Wird von dem Thread aus direkt auf die GUI zugegriffen?
Wenn ja: Das ist das Problem.

Nur der Mainthread darf die GUI verändern.
In einem anderen Thread wurde dir bereits gesagt, mit welchen Funktionen du arbeiten musst.
Ob du das tust? Keine Ahnung. Leider zeigst du keinen Code und meine Kristallkugel ist leider kaputt.
Neu111
User
Beiträge: 64
Registriert: Dienstag 10. März 2020, 19:02

sparrow hat geschrieben: Donnerstag 3. November 2022, 13:55 Wird von dem Thread aus direkt auf die GUI zugegriffen?
Wenn ja: Das ist das Problem.
Ja, innerhalb des Thread`s erfolgen nicht nur die API-Abfragen (REST), sondern auch die Übertragung der Daten in die GUI.
Wenn nur das Hauptprogramm die GUI beeinflussen darf, stehe ich wieder vor dem gleichen Problem, nämlich dem dass das Hauptprogramm warten muss, bis die Daten von der API zurückgeliefert wurden (wenn es beispielsweise 20 API-Abfragen sind, haben alle Abfragen noch dazu unterschiedliche Laufzeiten).
Ist jetzt der nächste Ansatz der, mit Queue`s zu arbeiten?

PS: Danke sparrow, für deinen wichtigen Hinweis.
Sirius3
User
Beiträge: 16664
Registriert: Sonntag 21. Oktober 2012, 17:20

Neu111 hat geschrieben: Freitag 4. November 2022, 07:03 Ist jetzt der nächste Ansatz der, mit Queue`s zu arbeiten?

Ja, ist es.
Benutzeravatar
__blackjack__
User
Beiträge: 11265
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich dazu ja auch in dem anderen Thema schon geschrieben hatte, das man bei `wx` die Funktionen `CallAfter()` und/oder `PostEvent()` sicher aus Threads heraus verwenden kann und da keine eigene(n) Queue(s) basteln muss, weil man die Ereigniswarteschlange von `wx` auf diese Weise verwenden kann um Aufrufe/Informationen in den GUI-Thread zu bekommen.
“It should be noted that no ethically-trained software engineer would ever consent to write a `DestroyBaghdad` procedure. Basic professional ethics would instead require him to write a `DestroyCity` procedure, to which `Baghdad` could be given as a parameter.” — Nathaniel Borenstein
Neu111
User
Beiträge: 64
Registriert: Dienstag 10. März 2020, 19:02

Ich habe das Problem jetzt anders gelöst:
Mit der Methode "threading" werden nur noch die Daten über die REST-API ausgelesen, um sie dann in eine globale Variable zu schreiben.
Mit der Funktion "wx.Timer" generiere ich eine Endlosschleife, mit der die globale Variable auf neue Inhalte geprüft wird. Sind neue Daten da, werden diese in die GUI geschrieben, und der Inhalt wird aus der globalen Variable herausgelöscht.
Funktioniert wunderbar!
Benutzeravatar
sparrow
User
Beiträge: 3563
Registriert: Freitag 17. April 2009, 10:28

Globale Variablen vermeidet man tunlichst, weil damit Programme unwartbar werden.
Zu sehen wo und wann welche Werte dorthin geschrieben werden, lässt sich im Code nicht nachvollziehen.
Du machst aus deinem Code ja eh immer ein großes Geheimnis, was das Helfen schon extrem erschwert, aber damit machst du es quasi unmöglich.
Wie es richtig geht wurde dir 2 Mal gesagt. Keine Ahnung, warum du das konsequent ignorierst.
Antworten