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/)
-   -   NamedPipes - Status des Buffers (https://www.delphipraxis.net/183717-namedpipes-status-des-buffers.html)

Neutral General 30. Jan 2015 16:29

NamedPipes - Status des Buffers
 
Hallo,

Ich habe hier 2 Programme (A und B) die via NamedPipes miteinander kommunizieren.
Angenommen die Buffergröße beträg 120 Bytes. Nun schreibt A 100 Bytes in die Pipe, die B auslesen könnte. Bevor B aber die Daten liest, möchte A weitere 100 Bytes senden.

Problem: In diesem Fall würde WriteFile blockieren solange B seine Daten nicht ausliest, da der Buffer für die Schreiboperation nicht ausreicht und WriteFile solange blockiert bis genug Speicher frei ist (B also in dem Fall mindestens 80 Bytes gelesen hat).

Ich möchte nun also bevor ich mit A Daten sende wissen wie viel Platz B noch in seinem Buffer hat und falls nicht genug Platz vorhanden ist erst gar nicht WriteFile aufrufen.

Gibt es da etwas?

himitsu 30. Jan 2015 17:00

AW: NamedPipes - Status des Buffers
 
WriteFile blockiert?

Ich dachte das bricht einfach ab und gibt einen passenden Fehlercode zurück, wenn irgendwas nicht ging. :stupid:

BUG 30. Jan 2015 17:44

AW: NamedPipes - Status des Buffers
 
Zitat:

Zitat von himitsu (Beitrag 1288333)
wenn irgendwas nicht ging. :stupid:

Es geht doch, bloß nicht jetzt :mrgreen:

Du kannst die Pipe mit PIPE_NOWAIT erstellen; das ist aber nicht empfohlen. Außerdem gibt es asynchrones IO (overlapping); das solltest du dir angucken.

Neutral General 30. Jan 2015 20:23

AW: NamedPipes - Status des Buffers
 
Ja ich kenne PIPE_NOWAIT und overlapped IO.
Asynchron geht leider nicht weil ich in einer Methode schreiben und lesen muss. Ich brauche also noch vor dem Ende der Methode eine Antwort. Für ReadFile habe ich PeekNamedPipe benutzt. Damit kann ich einfach schauen ob und wie viel im Input-Buffer drin ist. Ich hatte gehofft das wäre für die andere Richtung auch auf irgendeine Weise möglich.

himitsu 30. Jan 2015 20:36

AW: NamedPipes - Status des Buffers
 
Zitat:

PeekNamedPipe function

Copies data from a named or anonymous pipe into a buffer without removing it from the pipe. It also returns information about data in the pipe.
Also direkt die Größe auslesen tut das auch nicht.

Nun andersrum geht das leider nicht.
> Daten in den Puffer schreiben, bis er voll ist, mitzählen wieviel das war und dann alles schnell wieder entfernen ... nur blöd, daß dabei die andere Seite auf das geschriebene zugreifen könnte, bevor man es entfernt hat.

Beim Lesen wieviel jetzt da ist, ist es egal, ob mittendrin noch mehr im Puffer landet, weil man das in diesem Durchlauf garnicht mitbekommt.



PS: Auch bei Asynchron kann man warten ... nur eben mit der Möglichkeit das Warten auch abbrechen zu können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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