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.
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
Darf ich aus dem Thread heraus einen MessageDialog aufrufen?
OK, ist wirklich etwas sehr spartanisch (gewesen).
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. 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.