Hallo Maxk!
Was willst Du denn für Daten übergeben, und was soll damit geschehen?
Wenn z.B. der Thread etwas erledigen soll und die Form eine Fortschrittsanzeige anzeigen, haben wir den Fall, daß nur ein Thread die Variable verändert, der andere (Hauptthread) greift nur lesend darauf zu.
Dann einfach eine Variable in den Interface-Teil der Thread-Unit packe und von der Form aus darauf zugreifen.
Wenn mehrere Threads auf eine Variable (bei mir war es mal eine Stringlist) verändernd zugreifen wollen, bietet sich eine Synchronisierung über tCriticalSection an.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var cs: tCriticalSection;
cs := tCriticalSection.Create; //anlegen des Objekts
cs.Free; //freigeben am Programmende
..
cs.Enter; // Zugriffe, die exklusiv erfolgen sollen cs.Leave; |
Deklarieren im Interface-Abschnitt der Thread-Unit, Initialisieren im INITIALIZATION-Abschnitt, Freigeben im FINALIZATION-Abschnitt der Unit.
Dann alle exklusiven Abschnitte mit Enter/Leave klammern.
Achtung: wenn ein Thread das nicht wieder freigibt, warten alle Anderen vor der Türe!
Nochmal Vorsicht: wer schon drin ist, kann sich nicht nochmal anstellen, also keinesfalls 2 * Enter hintereinander! Optimal:
Quelltext
1: 2: 3: 4: 5: 6:
| cs.Enter; try // Arbeit finally cs.Free; end; |
Und nicht vergessen:
Quelltext
in die Unit mit der Deklaration setzen.
Gruß
Dietmar Brüggendiek