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
oderReadFileEx
- 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 vonFILE_FLAG_WRITE_THROUGH
ist nicht zu helfen, eine lokale pipe, mitCreateFile
undFILE_FLAG_NO_BUFFERING
können. Hast du das ausprobiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Pufferung ist wahrscheinlich in der C-Laufzeit (printf etc.) und es gibt nicht viel Sie dagegen tun können (IIRC macht es einen isatty() überprüfen, um zu bestimmen, eine Puffer-Strategie)
isatty
Funktion.isatty
: msdn.microsoft.com/en-us/library/aa364960.aspxGibt es SetNamedPipeHandleState, aber es steuert nur die Pufferung für remote-Leitungen, nicht, wenn beide enden auf dem gleichen computer.
Es scheint mir, dass du das problem lösen können wenn Sie den
hStdOutput
undhStdError
vonSTARTUPINFO
nicht zu pipe-handles erstellt mitCreatePipe
, aber stattdessen erstellen Sie eine benannte pipes (mitCallNamedPipe
Funktion genau wie Sie verwendet werden, wenn zuvor auch mit SECURITY_ATTRIBUTES mitbInheritHandle
=TRUE
finden Sie http://msdn.microsoft.com/en-us/library/aa365782.aspx) und öffnen Sie es, indem Sie Namen mit Bezug aufCreateFile
mitFILE_FLAG_WRITE_THROUGH
Flagge. Wie Lesen Sie auf der MSDN-Website (http://msdn.microsoft.com/en-us/library/aa365592.aspx):So einfach öffnen Sie das Rohr mit Bezug auf
CreateFile
mitFILE_FLAG_WRITE_THROUGH
- flag und das handle/GriffehStdOutput
undhStdError
vonSTARTUPINFO
.