Zitat von
messie:
... halte ich für falsch, denn es würde einen TButton im Thread-Objekt voraussetzen. Eher so:
Das ist gehustet wie gesprungen. Es ist schliesslich nicht die gesamte Klasse welche den Thread stellt, sonder nur die Execute Methode welche innerhalb des Threads läuft. Wenn du nun mit Synchronize() eine Methode angibst, dann wird die Adresse der Methode per SendMessage in den
VCL Thread (Message-Queue Bearbeitung) geschickt und dort dann aufgerufen. SendMessage kehrt nach der Ausführung mit dem Result zurück und in so fern wartet der Thread auf die Abarbeitung der angegebenen Routine (alles grob und vereinfacht).
Welche Methode dort angegeben wird, ist völlig egal. Es kann genauso gut eine Methode des Threads sein. Dies sollte sogar bevorzugt werden, weil:
a) Form1 eine globale Variable ist und nebenbei durch den
VCL Thread bzw. alternativ "das Programm" sonstwie verändert werden (Zeit bis zum erreichen der Message vom Synchronize in der Message Queue). Dabei u.a. auch die Freigabe der Instanz etc und schon ist deine Methode weg - bzw greift auf nicht mehr gültigen Speicher zu, wenn sie Elemente nutzt.
b) Die Thread-Methoden meistens nicht reentrant aufgerufen werden und u.a. auch leichter dagegen geschützt werden können (Deklaration im Private-Abschnitt des Threads) als die
VCL Formular-Methoden bzw. Methoden im
VCL Thread ("das Programm"). Diese müssen schliesslich public sein, damit sie für die Synchronize Methode angegeben werden können.
Das bestehende Handling mit Synchronize muss vom Threadersteller nicht geändert werden, sondern ist so ok wie es ist.