Entwickler-Ecke

Sonstiges (Delphi) - Synchronize oder WM


maxk - Di 18.02.03 10:54
Titel: Synchronize oder WM
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


Brueggendiek - 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.

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
1:
uses SyncObjs;                    

in die Unit mit der Deklaration setzen.

Gruß

Dietmar Brüggendiek