Deaktivieren Sie die Pufferung auf umgeleiteten stdout Pipe (Win32 API, C++)

Ich bin laichen ein Prozess von Win32 verwenden CreateProcess Einstellung der hStdOutput und hStdError Eigenschaften STARTUPINFO zu pipe-handles erstellt mit CreatePipe. Ich habe zwei threads zu Lesen, die Rohre, warten, für die Daten verfügbar werden (oder der Vorgang abgeschlossen ist, an welcher Stelle es überprüft, dass es keine Daten, Links, vor dem beenden den thread).

Als Daten zur Verfügung stehen, Schreibe ich die Ausgabe aus, um effektiv eine große textbox.

Was passiert, ist dass die Ausgabe gepuffert, so einen langsam Laufenden Prozess bekommt nur Datenblöcke geworfen in das Textfeld, aber nicht "wie es passiert".

Ich bin mir nicht sicher, ob es das Rohr, das macht die Pufferung, oder etwas zu tun mit der Umleitung.

Gibt es eine Möglichkeit, entweder das Rohr zu werden, Ungepuffert, oder starten Sie den Prozess in der Weise, dass der stdout wird so bald wie möglich gesendet?

Ich Teste mit einer test-app, die druckt Linien, die eine Sekunde auseinander

Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
  • Tut Sie es stream reibungslos, wenn der Prozess zu schreiben ist eine Konsole? Auf linux ist dies ein ziemlich bekanntes problem, und die Lösung ist zum zuweisen eines pseudo-tty, da einige Programme aktivieren, die Pufferung, wenn die Ausgabe nicht eine tty-Schnittstelle. Auf Windows ist es nicht üblich, überprüfen Sie den Dateityp von stdout, also würde ich nicht erwarten, Pufferung, anders zu sein geht in eine pipe vs Konsole.
  • Ja, wenn es auf der Konsole (dh. cmd.exe), es strömt wie erwartet, mit den Verzögerungen und so weiter.
  • Wie ist der Prozess zu schreiben, um die standard-Ausgabe? Ich denke, Sie könnten mit C-oder C++ - streams Pufferung eingeschaltet.
  • Pufferung in C und/oder C++ - Laufzeit-Bibliotheken verursachen würde, die Ausgabe der Konsole zu sein, die Burst-als auch.
  • Vielleicht ist der blockiness eingeführt wird, die auf das lese-Ende. Welche Puffergröße Sie verwenden, wenn Sie das Lesen aus der pipe? Verwenden Sie ReadFile oder ReadFileEx - API direkt oder einige wrapper in deinem Rahmen? Was passiert, wenn Sie Lesen, mit einem ein-Zeichen-Puffer-Größe? Während Oleg den Vorschlag von FILE_FLAG_WRITE_THROUGH ist nicht zu helfen, eine lokale pipe, mit CreateFile und FILE_FLAG_NO_BUFFERING können. Hast du das ausprobiert?
Schreibe einen Kommentar