Threads und gemeinsame Zugriffe
-
Hallo,
ich bin gerade dabei einen Systemprozess zu schreiben. Da
dieser logischer Weise ohne GUI arbeitet schreibt er Fehler-
meldungen oder Vorgänge die nicht korrekt ausgeführt werden
konnten in ein Log. Dazu verwende ich eine TSTringList.Da jedoch viele (kleine) Vorgänge gleichzeitig überwacht
werden existieren mehrere Threads. Diese "müssen" alle in
das selbe Log schreiben (zeitlicher Ablauf).ThreadA-> Unit1.Log <- ThreadB
Nun stellt sich nur aus der Logik heraus die Frage was
passiert wenn A-Hörnchen und B-Hörnchen beide die Nuss essen
wollen?Ich habe schön öfters etwas von \'WaitForSingleObject\' gehört.
Bevor ich mich dort jetzt tiefer mit beschäftige, könnte ich
damit das Problem welches noch ein Risiko ist ausmertzen?Stelle mir das ca. so vor das er nach Aufruf der Funktion auf
das "Objekt" wartet bis es wieder "frei" ist. Liege ich da richtig?
Oder liege ich da im Ansatz schon falsch?
-
Mit einer CRITICAL_SECTION lässt sich das ganz gut lösen. Allerdings muss der Thread das Log sperren, den Logeintrag schreiben und das Log wieder freigeben.
Schöner wäre es, das Log in einen eigenen Thread auszulagern und diesen mit Windows-Botschaften zu steuern. Dann brauchst Du dich um die Synchronisation gar nicht kümmern und die Threads können parallel zum Log arbeiten.
-
Die Idee über die Windowsmessages hatte ich bereits auch.
Auf ähnlich Art habe ich auch schon öfters gearbeitet. Allerdings
handelte es sich da um verschiedene Fenster und hab in dem Fenster
in dem die Variabel existiert auf die Zugegriffen werden soll
eine entsprechende Funktion geschrieben die das ganze Managed und die
Nachrichten via SendMessage an die Form gesand. Nur wie gesagt da gab
es Fenster und ich glaube nicht das ich Nachrichten an Threads via
SendMessage() senden kann.Ich denke wenn ich das Log in Thread-C auslagere und dort eine Funktion
nutze die den 'privat' Log beschreibt von A & B aufrufe habe ich die
Zugriffproblematik ja erneut, oder?Ansich gefällt mir die Idee mit dem "Manage-Thread" aber sehr gut. Klingt
sauber und ordentlich
Nach was sollte ich mal suchen wenn ich Nachrichten
an Threads senden möchte? ProcessMessage() schiesst mir da gerade vom Wortlaut
her durch den Kopf!?
-
Schau dir mal die folgende WinAPI-Funktionen an:
PostThreadMessage()
WaitMessage()
PeekMessage() oder GetMessage()
-
Die Namen sind ja fast selbst erklärend

Danke werde mir die Infos dazu Heute abend mal
zu Gemüte führen.