Moin...
Ich fange mal an...
Zitat:
Ich habe doch mit einer globalen Variable gearbeitet
...genau deshalb (u.a.) sind die globale Variablen so verpönt.
Zitat:
Wie ist das möglich? Was für ein Thread wird denn da erzeugt?
Du erzeugst eine Thread und legst ihn in die Variable ab. Das ist alles.
ABER: Du tauscht nur den Pointer auf den Thread
IN der Variable aus.
Sinnbild:
1. Tasse mit Teebeutel = Thread in der Variable
2. neuer Teebeutel soll in die Tasse = Erzeugung Thread
3. Teebeutel in der Tasse wird auf den Tisch gelegt und der neue Teebeutel kommt in die Tasse.
-> beide Teebeutel existieren.
Die Tasse kennt aber nur den Teebeutel in der Tasse.
Zitat:
Wie kann ich einen Thread ansprechen, der zur Laufzeit erzeugt wurde?
Das betrifft auch den obigen Teil. Jeder Thread ist quasi nur ein Pointer in der Variable.
Die Lösung: Verwalte deine Threads in Listen oder Dictionaries (je nach Anwendungsfall). Dann kannst du dir den Thread aus der Liste wieder in eine Variable "laden" und kannst dann damit arbeiten. ...fertsch.
https://docwiki.embarcadero.com/Libr...es.TThreadList
Delphi-Quellcode:
Synchronize(procedure
begin
Form1.Write_Uhr(Now());
end);
Synchronize ist ja soweit ok.
Für die Zukunft aber:
Die Threads sollten eine eigene
Unit haben. Der Thread und die Thread
Unit, dürfen die Anwesenheit der Form NICHT kennen. Dem Thread muß egal sein was dann passiert.
Thema Wiederverwendbarkeit und zirkuläre Aufrufe.
Lösung:
Im Synchronize mit Events Arbeiten. Das aufrufende Objekt, in deinem Falle die Form, nimmt das Event entgegen und macht in ihrem "Bereich" das was zu zun ist:
Write_Uhr(Now)
Beispiel:
Delphi-Quellcode:
Synchronize(procedure
begin
if Assigned(FOnChangeTime) then
begin
FOnChangeTime(Self);
end;
end);
PS:
Bitte vermeide Denglisch. Das tut an den Augen weh.
TH_Eins: TMyThread_Eins;
besser
Bitte keine Unterstriche sondern CamelCase
https://de.wikipedia.org/wiki/Binnen...ammiersprachen
Bitte gebe deinen Componenten, auch zum Testen, von Anfang an sprechende Namen.
Form1 ist