Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
Delphi 7 Enterprise
|
Re: Trotz Threads keine Reaktion
24. Jan 2008, 19:18
Synchronisieren
Problem: Da du nie weist wo welcher Thread gerade ist im Programmablauf, kann es passieren, dass mehrere Threads gleichzeit auf denselben Speicherplatz zugreifen. Ungünstigerweise schreibt der eine gerade was, während der andere genau an der Stelle liest. Dadurch entstehen nicht nur Fehler weil die Werte falsch sind, Es kann auch ganz leicht zu Speicherzugriffsverletzungen führen. Wenn zum Beispiel der eine Thread dachte die dynamische Variable existiert noch, während der andere sie grad löscht (und neu anlegt mit anderer Größe).
Lösung:
Nun kann man solche Zugriffe absichern (z.B.) über Critical Sections. Da das aber recht kompliziert ist und wir mit Delphi ja einfach klicken und programmieren wollen, hat man sich synchronize ausgedacht.
Wat macht dat nun:
Das ist ein bisschen tricky. Prinzipiell gibt es eine globale Liste für Methoden, an die jeder Thread etwas anhängen kann. An diese Liste hängt synchronize einfach deine Methode ran. Und jetzt wartet dein Thread (bleibt einfach stehen) erstmal.
Jetzt ist der MainThread drann. Wenn der grade nix besseres zu tun hat, dann schaut er mal, ob in der Liste etwas zum abarbeiten drin steht. Wenn das der Fall ist führt er die Methode aus und löscht sie aus der Liste. Dadurch führst du die Methode, die du synchronize übergeben hast im MainThread durch während dein Thread schläft. Dein Thread wartet nämlich auf ein Signal vom MainThread, dass der Mainthread mit der Methode fertig ist. Das ist alles. Und du hast den Vorteil: du kannst problemlos auf Variablen aus MainThread und aus deinem Thread zugreifen.
Synchronize hat aber auch Nachteile. Einen dürftest du aufgedeckt haben. Die Liste fragt der Mainthread in einer while-Schleife ab: "while List.count>0 do". Das Problem dabei entsteht, wenn es mehrere Threads gibt, die ununterbrochen die Liste füllen. Dadurch kommt der Mainthread aus dieser Schleife nicht mehr raus. Der eine Thread wartet zwar bis seine Methode abgearbeitet ist aber unterdessen füllen die anderen beiden Threads die Liste wieder auf. Dadurch macht der Mainthread nix anderes mehr, als die Liste abzuarbeiten und reagiert auf keine Messages mehr. Kommt also gar nicht zum Zeichnen und interessiert sich auch nicht für sonstige Eingaben.
Es gibt mit synchronize noch andere Probleme, die fallen mir nur grad nicht ein. Die letzten Sätze sollen diese Methode nicht durch den Dreck ziehen, ich wollte nur kurz aufzeigen, dass es zwar schön einfach ist. Aber man sollte den Mechanismus immer bedenken.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
|