AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi IPC / MMF / Mutex Syncronisationsproblem
Thema durchsuchen
Ansicht
Themen-Optionen

IPC / MMF / Mutex Syncronisationsproblem

Ein Thema von Mavarik · begonnen am 10. Feb 2009 · letzter Beitrag vom 10. Feb 2009
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#1

IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:13
Hallo Zusammen!

Folgendes Problem...

Ich habe einen Systemdienst und eine Anwendung...

Der Systemdienst holt sich einen Mutex mit:

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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:17
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:27
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#4

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:41
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 )
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 10:54
AHHHHHHHH alles Klar...

Dass kommt davon, wenn man immer von proceduraler Programmierung ausgeht.. RelaseMutex kommt natürlich sofort wieder...

Danke.. Jetzt hab ichs...

  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#7

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 11:18
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 11:30
naja, sleep(0) wäre mir zu riskant. Grund hast du ja schon selbst geschrieben.

btw: Sleep(0) = SwitchToThread
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#9

Re: IPC / MMF / Mutex Syncronisationsproblem

  Alt 10. Feb 2009, 11:37
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 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