Je fraye un processus de Win32 en utilisant CreateProcess
, fixant les hStdOutput
et hStdError
propriétés de STARTUPINFO
à tuyau poignées créé avec CreatePipe
. J'ai deux threads lisant les tuyaux, attendant que les données deviennent disponibles (ou le processus à compléter, à quel point il vérifie qu'il n'y a plus de données avant de terminer le thread).
Au fur et à mesure que les données deviennent disponibles, j'écris la sortie sur une grande zone de texte.tampon Disable sur le tuyau de sortie standard redirigé (API Win32, C++)
Ce qui se passe est que la sortie est mise en mémoire tampon, donc un processus lent exécute seulement des blocs de données lancés dans la zone de texte, mais pas "comme cela arrive".
Je ne suis pas sûr si c'est le tuyau qui fait la mise en mémoire tampon, ou quelque chose à voir avec la redirection.
Y a-t-il un moyen de configurer le canal pour qu'il ne soit pas saturé ou de démarrer le processus de sorte que la sortie stdout soit envoyée le plus tôt possible?
Je teste avec une application de test qui imprime des lignes de une seconde
Here is line one
(waits one second)
Here is line two
(waits one second)
... etc
Le flux est-il fluide lorsque le processus écrit sur une console? Sur Linux c'est un problème assez connu, et la solution est d'allouer un pseudo-tty car certains programmes activent la mise en mémoire tampon quand la sortie n'est pas un tty. Sous Windows, il n'est pas courant de vérifier le type de fichier stdout, donc je ne m'attendrais pas à ce que la mise en mémoire tampon soit différente dans un tube par rapport à une console. –
Oui, lorsqu'il est sur la console (c'est-à-dire cmd.exe), il est diffusé comme prévu, avec les retards et ainsi de suite. –
Comment le processus écrit-il sur la sortie standard? Je pense que vous pourriez avoir activé la mise en mémoire tampon des flux C ou C++. – wilx