Eine Anwendung als NamedPipe Server und Client
-
Hallo,
ich habe eine Anwendung, besser gesagt eine DLL.
Darin starte ich einen Thread.
Dieser Thread überprüft als erstes mit WaitNamedPipe ob eine Pipe existiert.
Wenn nicht wird er zum Server und erzeugt eine Pipe mit CreateNamedPipe.Nun wird eine zweite DLL, eigentlich im selben Moment, geladen.
Auch diese überprüft mit WaitNamedPipe ob die Pipe existiert.
Wenn ja wird er zum Client und verbindet sich zur Pipe.Nun geht das aber so schnell, das die erste DLL Instanz noch im erzeugen der Server Pipe ist, aber die zweite schon sagt sie existiert nicht und sich selber als Server startet was natürlich nicht geht, denn bis dahin ist die Pipe schon da.
Hat da jemand eine Idee wie man das abfangen könnte?
Dabei ist es egal ob die erste Instanz oder die zweite der Server ist.Ich habe schon an ein Sleep(1) * RandomNumber gedacht, damit die DLLs einen kleinen Zeitversatz haben.
Oder mit einem Marker der in der Memory gesetzt wird. Das sollte schneller gehen als eine Pipe zu erzeugen.
-
Weiß ich alles nicht auswendig. Aber die ganzen Funktionen geben dokumentierte Rückgabewerte zurück. Da gibts irgendwas mit Busy oder so, das heißt dann, jemand ist grad dabei, die Pipe zu erstellen. Wenn die Operation mit einem bestimmten Error Code fehlschlägt, etwas warten und nochmal probieren. Vielleicht habe ich das mit Busy aber auch falsch in Erinnerung. Schau dir jedenfalls die Rückgabewerte in der MSDN durch, ist schon vorgesehen, dass man darauf reagieren kann.
-
schwa226 schrieb:
Nun geht das aber so schnell, das die erste DLL Instanz noch im erzeugen der Server Pipe ist, aber die zweite schon sagt sie existiert nicht und sich selber als Server startet was natürlich nicht geht, denn bis dahin ist die Pipe schon da.
Hat da jemand eine Idee wie man das abfangen könnte?
Klar, sogar gleich 2.
1: Retry-Schleife wenn der Fehlercode "gibt's schon" besagt.
Also quasifor retry = 1 to 5 test ob's schon gibt if (gibts schon) fehlercode = connect else fehlercode = create if (fehlercode == "gibts schon" oder fehlercode == "gibts nicht") ; // Erwarteter Fehler => retry else break // Erfolg oder Fehler den wir nicht behandeln können => raus next if fehlercode != "alles OK" problemFalls du Fälle beobachtest wo es mehr als 2 Versuche braucht kannst du ein Sleep reinknallen und die Retry-Anzahl ordentlich raufdrehen.
Bzw. wie Mechanics geschrieben hat: wenn es nen Fehlercode für "wird gerade erstellt" gibt, dann kannst du natürlich sagen "wenn Fehlercode == "wird gerade erstellt" dann Retry-Count ignorieren und so lange weitermachen bis ein anderer Fehlercode kommt". Oder so
2: Mach ne globale Mutex drum-rum.
Alsomutex lock test ob's schon gibt if (gibts schon) fehlercode = connect else fehlercode = create mutex unlock if fehlercode != "alles OK" problemEgal für welche der beiden Möglichkeiten du dich entscheidest ist natürlich wichtig dass beide DLLs das selbe machen. Wenn eine mit Retries macht und die andere mit Mutex, dann kann's erst wieder schief gehen.
-
Danke,
an sowas habe ich auch schon gedacht. Muss mal sehen wie sich das am besten umsetzen lässt.