Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
|
Re: Klasse klasse mit mehreren Threads synchronisieren
19. Jul 2003, 12:42
Nutze InterlockedXXXX() funktionen und Zwischengespeicherte Ergebnissmengen. Der TreeView wiederum nutzt Polling um per InterlockedXX() Variablen die Zwischengespeicherten Mengen in seinen Context zu kopieren. Soweit in kurzform, ich glaube aber ich muß es klarer verdeutlichen.
Der TreeView zeigt einen bestimmten Status an. Dazu werden dahinterliedende Datenmengen benötigt. Der UpdaterThread hat ein eigenes vollständiges Duplikat dieser Daten, aktualisiert alle Änderungen und erzeugt die Daten die dann im TreeView angezeigt werden. Nun inkementiert er einen Zähler per InterlockedIncrement(FMustDisplay).
Der UpdaterThread aktualisiert die Daten wenn FMustUpdate = 0 ist und setzt diesen Wert auf 1 während er Updated. Ist er fertig mit dem Update dann erhöht er diesen Wert auf 2. Der MainThread.TTreeView pollt FMustDisplay und wenn der Wert 2 vorliegt beginnt er diese Daten einzuarbeiten. Er erhöht den Wert auf 3 und wenn er fertig ist setzt er ihn auf 0 zurück.
Da ein Zugriff auf einen an 4 Bytegrenzen ausgerichteten Integer als Atomarer Zugriff stattfindet, und atomare Operationen der CPU threadsafe sind, lässt sich das sogar ohne InterlockedXXX() Funktionen erledigen.
Solange FMustDisplay <= 2 ist kann der UpdaterThread erneut seine Daten ändern. Da der TreeView im Idle-Modus, also immer FMustDisplay pollt wenn keine Messages im Queue sind, wird es sogar möglich das der UpdaterThread mehrmals sehr schnell hintereinander die daten aktualisert. Der TreeView zeigt aber immer nur den letzten Zustand an, also leicht Zeitversetzt.
Gruß Hagen
|