Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IPC / MMF / Mutex Syncronisationsproblem (https://www.delphipraxis.net/128965-ipc-mmf-mutex-syncronisationsproblem.html)

Mavarik 10. Feb 2009 10:13


IPC / MMF / Mutex Syncronisationsproblem
 
Hallo Zusammen!

Folgendes Problem...

Ich habe einen Systemdienst und eine Anwendung...

Der Systemdienst holt sich einen Mutex mit:

Delphi-Quellcode:
PutterMutex := CreateMutex(nil, true, PutterMutexName);
Die Anwendung wartet mit:

Delphi-Quellcode:
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 ...
Der Service hat jetzt eine Schleife:

Delphi-Quellcode:
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;
Soweit so gut...

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:

sirius 10. Feb 2009 10:17

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.

Mavarik 10. Feb 2009 10:27

Re: IPC / MMF / Mutex Syncronisationsproblem
 
Zitat:

Zitat von sirius
Derzeit hast du ein Wettlaufproblem.

Warum?

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

himitsu 10. Feb 2009 10:38

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.

sirius 10. Feb 2009 10:41

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:
 ReleaseMutex(PutterMutex);
 if WaitForSingleObject(PutterMutex, 20000)<>WAIT_OBJECT_0 then
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.


(Ich sehe den roten Kasten, schicke aber trotzdem ab ;) )

Mavarik 10. Feb 2009 10:54

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:

himitsu 10. Feb 2009 11:18

Re: IPC / MMF / Mutex Syncronisationsproblem
 
du könntest z.B. per Sleep die Threadverarbeitung abbrechen.

Delphi-Quellcode:
ReleaseMutex(PutterMutex);
Sleep(0);
if WaitForSingleObject(PutterMutex, 20000)<>WAIT_OBJECT_0 then
es kommt dann hier nur noch darauf an, wie Windows die Threads verwaltet und ob es den anderen Thread vorher verarbeitet :roll:

sirius 10. Feb 2009 11:30

Re: IPC / MMF / Mutex Syncronisationsproblem
 
naja, sleep(0) wäre mir zu riskant. Grund hast du ja schon selbst geschrieben.

btw: Sleep(0) = SwitchToThread

himitsu 10. Feb 2009 11:37

Re: IPC / MMF / Mutex Syncronisationsproblem
 
MSDN-Library durchsuchenCreateEvent
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 04:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz