sto creando un processo da Win32 usando CreateProcess
, impostando le hStdOutput
e hStdError
proprietà di STARTUPINFO
convogliare maniglie creato con CreatePipe
. Ho due thread che leggono le pipe, in attesa che i dati diventino disponibili (o il processo da completare, a quel punto controlla che non ci siano dati mancanti prima di terminare il thread).
Quando i dati diventano disponibili, scrivo l'output in modo efficace in una grande casella di testo.buffer Disable su reindirizzati stdout tubo (API Win32, C++)
Quello che sta succedendo è che l'output è in fase di buffering, quindi un processo lento in esecuzione ottiene solo blocchi di dati lanciati nella casella di testo, ma non "come accade".
Non sono sicuro che sia il pipe che sta eseguendo il buffering, o qualcosa a che fare con il reindirizzamento.
Esiste un modo per impostare il pipe su unbuffered o avviare il processo in modo tale che lo stdout venga inviato il prima possibile?
sto testando con un'applicazione di test che stampa le linee uno secondo a parte
Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
Si trasmette senza problemi quando il processo sta scrivendo su una console? Su Linux questo è un problema abbastanza noto, e la soluzione è allocare uno pseudo-tty perché alcuni programmi attivano il buffering quando l'output non è un tty. Su Windows non è comune controllare il tipo di file di stdout, quindi non mi aspetto che il buffering diventi diverso in una pipe vs in una console. –
Sì, quando è sulla console (ad esempio cmd.exe), lo streaming come previsto, con i ritardi e così via. –
Come si scrive il processo sullo standard output? Penso che potresti aver attivato il buffering degli stream C o C++. – wilx