![]() |
IPC / MMF / Mutex Syncronisationsproblem
Hallo Zusammen!
Folgendes Problem... Ich habe einen Systemdienst und eine Anwendung... Der Systemdienst holt sich einen Mutex mit:
Delphi-Quellcode:
Die Anwendung wartet mit:
PutterMutex := CreateMutex(nil, true, PutterMutexName);
Delphi-Quellcode:
Der Service hat jetzt eine Schleife:
PutterMutex := CreateMutex(nil, false, PutterMutexName);
repeat if WaitForSingleObject(PutterMutex, 30000)=WAIT_OBJECT_0 then begin // HoleShared Memory // ... Tuwas ReleaseMutex(PutterMutex) // Signal Anwendung hats abgeholt end; Until ...
Delphi-Quellcode:
Soweit so gut...
for y:=0 to Yanz-1 do
for x:= 0 to Xanz-1 do begin // Belege Shared Memory ReleaseMutex(PutterMutex); // Signal DataDa, ich war owner if WaitForSingleObject(PutterMutex, 20000)<>WAIT_OBJECT_0 then // Warte auf Abgeholt... result := false; end; Das Funktioniert auch im Prinzip, jedoch erhalte ich auf der Seite der Application nicht alle Werte aller Schleifendurchläufe... Sondern nur (Für X z.B. 0,2,4,6,8 ) Es wird also nur jeder 2. Übergeben.. Dies ist jedoch nicht regelmäßig manchmal funktionieren auch aufeinanderfolgende... Aber eher selten... Wo liegt mein Fehler? Grüsse Frank :stupid: |
Re: IPC / MMF / Mutex Syncronisationsproblem
Ich würde einen zweiten Mutex verwenden. die Anwendung hat einen Mutex, und zeigt damit, dass sie fertig gelesen hat und der Service hat einen Mutex um zu zeigen, dass er fertig geschrieben hat.
Derzeit hast du ein Wettlaufproblem. |
Re: IPC / MMF / Mutex Syncronisationsproblem
Zitat:
System signalisier ich habe Daten und warten bis die Daten abgeholt werden Anwendung holt Daten ab und gibt ein Signal das die daten Abgeholt sind... Solange "sollte" der Systemprocess warten.. (Mal von Timeouts abgesehen) Wo liegt mein Denkfehler? Grüsse Frank |
Re: IPC / MMF / Mutex Syncronisationsproblem
Es warten beide ja darauf, daß es mal Frei wird und versuchen dann "gleichzeitig" den Zugriff zu bekommen ... wer schneller ist, der bekommt dabei den Zugriff.
Tja und wie du siehst, ist z.B. der Service manchmal schneller, bekommt dabei mehrmal hintereinander den Zugriff und deiner Anwendung fehlt damit der Wert, wo sie übergangen wurde und der Service schneller war. |
Re: IPC / MMF / Mutex Syncronisationsproblem
Wenn du ReleaseMutex aufrufst, läuft ein Thread der in waitforsingleobject steckt weiter. Soweit klar.
Jetzt ist nur die Frage, welcher Thread/Process zuerst bei waitforsingleobject ist. Und das hängt zufällig davon ab, wann der thread gewechselt wird. Gelegentlich läuft er hier durch:
Delphi-Quellcode:
Erst wird released und dann gleich wieder gesetzt. Wenn der andere Thread nicht zufällig vorher dran ist, bekommt er von dem Release nix mit.
ReleaseMutex(PutterMutex);
if WaitForSingleObject(PutterMutex, 20000)<>WAIT_OBJECT_0 then (Ich sehe den roten Kasten, schicke aber trotzdem ab ;) ) |
Re: IPC / MMF / Mutex Syncronisationsproblem
AHHHHHHHH alles Klar...
Dass kommt davon, wenn man immer von proceduraler Programmierung ausgeht.. RelaseMutex kommt natürlich sofort wieder... Danke.. Jetzt hab ichs... :dp: |
Re: IPC / MMF / Mutex Syncronisationsproblem
du könntest z.B. per Sleep die Threadverarbeitung abbrechen.
Delphi-Quellcode:
es kommt dann hier nur noch darauf an, wie Windows die Threads verwaltet und ob es den anderen Thread vorher verarbeitet :roll:
ReleaseMutex(PutterMutex);
Sleep(0); if WaitForSingleObject(PutterMutex, 20000)<>WAIT_OBJECT_0 then |
Re: IPC / MMF / Mutex Syncronisationsproblem
naja, sleep(0) wäre mir zu riskant. Grund hast du ja schon selbst geschrieben.
btw: Sleep(0) = SwitchToThread |
Re: IPC / MMF / Mutex Syncronisationsproblem
![]() Statt das Mutex immer wieder zu löschen und neu zu erstellen, wie wäre es mit ein/zwei Events? ein Event "IchHabeFertigMitSchreiben", welches vom Service (zurück)gesetzt wird und ein "IchHabeFertigMitLesen", was vom Programm gesteuert wurd. Diese kann man ja auch via Name über Prozessgrenzen hinweg betreiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz