Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TThread Controls aktualisieren lassen (https://www.delphipraxis.net/154358-tthread-controls-aktualisieren-lassen.html)

youuu 8. Sep 2010 10:28

TThread Controls aktualisieren lassen
 
Hi,

ich möchte mittel TThread z.B ein VST auf einem Frame verändern.
Allerdings sagt mir der Thread immer er erkennt das VST nicht, trotz einbindens der Unit.

Wenn ich es alleringds mit einen Form probiere klappt es.

Wieso nicht mit einem Frame?

Beispiel im Thread:

Delphi-Quellcode:
uses Form1, Frame1
Delphi-Quellcode:
Form1.Label1 := 'a'; <<< ist in Ordnung
Frame1.Label1 := 'a'; <<< erkennt er nicht

SirThornberry 8. Sep 2010 10:45

AW: TThread Controls aktualisieren lassen
 
Delphi-Quellcode:
Frame1.Label1 := 'a'; <<< erkennt er nicht
Der Grund ist recht einfach. Es kann ja sein das du mehrere Formulare hast und wenn du einfach Frame1.Irgendwas schreibst weiß weder der Compiler noch sonst wer wo sich der Frame befindet (er könnte ja auch auf Form2 liegen).
Daher muss es dann natürlich heißen
Delphi-Quellcode:
Form1.Frame1.Label1 := 'a';
Das funktioniert natürlich nur wenn der Frame auch auf Form1 liegt.

ALLERDINGS solltest du das niemals direkt aus dem Thread heraus machen sondern nur innerhalb einer Methode die du vorher mit Syncronize aufgerufen hast. Ansonsten passiert es ganz schnell das an irgendwelchen unerwarteten Stellen plötzlich Fehler auftreten.
Der Grund dafür ist das die VCL größtenteils nicht Threadsicher ist. Das heißt die Grafikkomponenten auf deinem Formular laufen in einem Thread und wenn du von einem anderen Thread aus direkt darauf zugreifst entstehen "wunderschöne" Fehler. Mit Syncronize innerhalb des Threads erreichst du das der Thread mit dem Formular-Thread (also dem Hauptthread) syncronisiert wird bzw. deine Befehle im Kontext des Hauptthreads ausgeführt werden.

Bernhard Geyer 8. Sep 2010 10:47

AW: TThread Controls aktualisieren lassen
 
Alle Windows-Controls (also alles was ein Windows-Handle hat) hat eine Thread-Affinität. Es darf nur im erzeugenden Thread angesprochen werden.

blackfin 8. Sep 2010 10:48

AW: TThread Controls aktualisieren lassen
 
Heisst es nicht auch zusätzlich noch

Zitat:

Form1.Frame1.Label1.Caption := 'a';
?

SirThornberry 8. Sep 2010 10:50

AW: TThread Controls aktualisieren lassen
 
Da hat der schwarze Delphin recht :-D Darauf hab ich gar nicht geachtet. Aber ich denke der Fragesteller hat es bereits richtig da sonst auch die erste Variante bei ihm nicht funktionieren würde.

youuu 8. Sep 2010 11:16

AW: TThread Controls aktualisieren lassen
 
Ja das war nur ein kleiner schnelligkeits Tippfehler :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz