Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Di 18.02.03 10:54 
Hi,
ich möchte von einem Thread Informationen an Form1 senden. Nun überlege ich, was sinnvoller ist, Windows-Messages oder direkte Aufrufe über Synchonize. Es handelt sich verwiegend um Zahlen, was die Verwendung von WMs empfiehlt. Allerdings ist der Aufwand einer WM höher als der einer Synchonizefunction.
Was würdet ihr verwenden?

maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mi 19.02.03 11:30 
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.
ausblenden 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:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
cs.Enter;
try
  // Arbeit
finally
  cs.Free;
end;


Und nicht vergessen:
ausblenden Quelltext
1:
uses SyncObjs;					

in die Unit mit der Deklaration setzen.

Gruß

Dietmar Brüggendiek