GUI-nderung im Thread

Irgendwo habe ich letztens gelesen, dass man im Thread keine nderungen der Controlls vornehmen darf (sollte?).
Bezieht sich das auf jedwede nderung?

Ich habe im Thread diverse Aktualisierungen (Progressbar-Anpassung und Refresh) oder auch ein/ausblenden von Elementen sowie Textnderung von Labels/Buttons bis zum Hinzufgen von Zeilen in Listboxen.

Ist das alles unzulssig?

Gru, Stefan Mettenbrink.

Ja. Am einfachsten setzt du im Thread Properties und benutzt einen oder mehrere UpdateTimer die das UI updaten.

P.S. Füg doch deine Stadt zu deinem Profil dazu …

In den Beispielen ist (meine ich) ein Beispiel dafür, wie Du die UI aus einem Thread heraus manipulieren kannst.

Du merkst schon, was zulssig ist, wenn Dir das mit “ThreadAccessingUIException” crasht. Nein, davon geht gar nichts. Ich finde immer noch welche von diesen netten Exceptions. Am einfachsten werkelt man da mit “CallDelegateOnMainThreadMBS” um das Problem herum.

Danke für die Hinweise.
Ich bin leider erst durch “ThreadAccessingUIException” (o. ä.) darauf gekommen, das ich ein Problem habe. Da ich derzeit noch (fast ausschließlich) mit RS2010r1 arbeite, ist mir das bislang nicht begegnet. Ich glaube, damals gab es keine entsprechende Exception.
Na ja, wird mir wenigstens nicht langweilig :wink:

Darf ich aus dem Thread heraus einen MessageDialog aufrufen?

OK, ist wirklich etwas sehr spartanisch (gewesen).

Gruß, Stefan Mettenbrink.

Früher war alles besser. Zumindest war der Code nicht so Spaghetti-mäßig.

Nein, es geht auch kein Message-Dialog.

Mist.
Ich hatte erwartet, das der wenigstens funktioniert, wenn er in der eigenen Umgebung erzeugt wird. :frowning:

Gru, Stefan Mettenbrink.

Darf ich bei einem Timer den Modus ndern?

Gru, Stefan Mettenbrink.

ja, klar.

Na so klar war mir das nicht. Ich htte erwartet, dass ich ebenso selbstverstndlich z. B. ProgressBar.Value verndern drfte.

Aber gut zu wissen. Sonst htte ich noch mal umbauen mssen.

Danke.

Gru, Stefan Mettenbrink.

Ich habe noch etwas gefunden:

g=IrgendeinFenster.graphics
g.textsize=Zeichensatzgroesse
g.textfont=Zeichensatz

Zulssig?

Alles, was das GUI verndern knnte, ist VERBOTEN. Sonst crasht das Programm.

Ich ndere in diesem Fall ja noch gar nicht die GUI. Darum frage ich ja nach.

Ich werde eine andere Lsung suchen.

Gru, Stefan Mettenbrink.

Doch. Zugriffe auf das Graphics-Objekt sind verboten, außer es handelt sich um das Graphics-Objekt eines Picture-Objekts.

Du kannst das Problem vielleicht besser verinnerlichen, wenn du dir die Gründe für diesen Wechsel bewusst machst: Unter Carbon gab es nur ein geschummeltes Multitasking – wir erinnern uns, das war ja damals das große Problem bei Apples Versuch, selbst ein echtes präemptives Multitasking aus OS 9 zu basteln.
Cocoa kennt sowas, und deshalb hat Apple den Zugriff unter Cocoa auf die GUI aus Threads heraus versagt: Wenn mehrere Threads quasi gleichzeitig die GUI manipulieren wollten, wäre das Ergebnis absolut unvorhersagbar. Dehalb hat Apple diese Funktionen als nicht thread-safe deklariert, mit dem Ergebnis, dass eine Exception auftritt, wenn man’s doch versucht.

Es bleibt dir also aus Gründen der OS-Modernität nichts anderes übrig, als umständlicher zu programmieren. :wink: Ob jetzt via Plugin, Declare oder Timer-Aufruf oder wie auch immer: Die GUI darf nur vom Main Thread aus manipuliert werden. Ein Xojo.Core.Timer.CallLater mit 0 delay z.B. lässt sich recht flink umsetzen.

@Stefan: Du solltest für alle GUI Zugriffe quasi Deine eigenen Properties machen, die Du dann aus dem Thread heraus verändern kannst z.B. bei einem Fenster self.MyWidth, self.myHeight anstelle .Width und .Height. Ein Timer kann dann diese Properties zum Neuzeichnen der GUI oder zum Erstellen eines Graphics Objektes verwenden.

@Ulrich Bogun: Vielen Dank für die Erklärungen. An mir ist das leider völlig vorbei gegangen. Das erklärt vieleicht auch die gelegentlichen Abstürze meines Programms ohne ersichtlichen Grund.
RS2010 hat noch keine Exception dazu gebracht. Jedenfalls ist sie mir nicht aufgefallen.

Gruß, Stefan Mettenbrink.

Das wurde mit Version 2013r1 eingeführt: Accessing the User Interface from a Thread

Danke für den zusätzlichen Link. Dort findet sich auch ein Hinweis auf ein entsprechendes Tool um Probleme aufzuspüren.
Ich lese mich mal ein.

Gruß, Stefan Mettenbrink.