C++ Redirection sortie standard d'une console

Fermé
Thesmarch - 8 juin 2012 à 11:03
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 9 juin 2012 à 14:50
Bonjour,

Je suis sous microsoft visual studio 10 en C++ Winform.

J'aimerais exécuter une ligne de commande, à partir du C++, qui génère une sortie standard.
Ce que je souhaiterais c'est obtenir cette sortie std dans une textbox, soit en temps réel soit une fois la commande terminée.

Cette la durée de traitement de cette commande peut être assez longue, donc j'aimerais aussi avoir une barre de progression.

Après plusieurs recherches, j'ai pensé faire quelque chose comme ca:

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
 
		//envoi de la commande pour analyser le fichier avi
		//system(ccmd);
                //progressBar1->PerformStep();
 
		Process^ compiler = gcnew Process;
		compiler->StartInfo->FileName = "cmd";
		compiler->StartInfo->Arguments = "ffmpeg -i"; //"ffmpeg -i \""+fichierPath+"\" -vf blackdetect=d=0.5:pic_th=0.70:pix_th=0.00 -f null -";
		compiler->StartInfo->UseShellExecute = false;
		compiler->StartInfo->RedirectStandardOutput = true;
		compiler->Start();
		textBox2->AppendText(compiler->StandardOutput->ReadToEnd());
		compiler->WaitForExit();
}



Le souci c'est que cette solution ne me permet pas d'obtenir la sortie std après l'exécution de la commande avec les arguments qui lui sont passés.
En effet j'obtiens uniquement :

Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>


J'ai également essayé d'ajouter le code ci-dessous mais j'ai une erreur à l'execution.


		// Use a stream writer to synchronously write the sort input.
		StreamWriter^ sortStreamWriter = compiler->StandardInput;
		// Start the asynchronous read of the sort output stream.
		compiler->BeginOutputReadLine();


Merci d'avance pour votre aide!
A voir également:

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
8 juin 2012 à 11:38
Bonjour,
Ce n'est pas du C++... Ne serait-ce pas plutôt du C# ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 14:02
En effet, ce n'est pas du C++.
Je ne connais pas le C#, mais si c'est compatible avec les fonction C, il est possible d'utiliser popen https://linux.die.net/man/3/popen qui te permettra d'utiliser la sortie standard de ta commande comme un fichier.
0
Merci pour votre aide!
Effectivement popen semble être une bonne idée.
J'ai du ajouter un : #include <conio.h>
Ainsi qu'un "_" avant "popen" afin qu'il fonctionne en C++ winform.

J'ai donc modifié mon code en :

				 

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

FILE *output = _popen("ffmpeg -i", "r");
_pclose(output);	

char buffer[1024];
char *line_p = fgets(buffer, sizeof(buffer), output);
String ^ str = gcnew String(line_p);
textBox2->AppendText(str);
}


Mais rien ne s'affiche dans la textBox2.
(Avec le debuger: str="")
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
8 juin 2012 à 15:33
On le redit, ce n'est pas du C++.
Après avoir regardé vite fait, il semblerait que ce soit du C++ .NET.
Bizarre de devoir inclure conio.h pour _popen... _popen() est défini dans stdio.h
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
8 juin 2012 à 15:58
Tu ferme ton output directement après l'avoir ouvert. Logique que tu n'aies rien, on ne peut lire sur un fichier fermé. Il faut mettre ton pclose() après la lecture.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Malheureusement même comme ça:

FILE *output = _popen("ffmpeg -i", "r");
		char buffer[1024];
		char *line_p = fgets(buffer, sizeof(buffer), output);
		String ^ str = gcnew String(line_p);
		textBox2->AppendText(output);
		_pclose(output);


Ça ne fonctionne pas :(
Une autre idée?
Merci
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
8 juin 2012 à 16:52
Quand, je dis que ce n'est pas du C++, ce n'est pas pour faire mon chieur. Mais c'est pour dire qu'il ne faut pas chercher du côté du C ou du C++...
Je ne connais pas ce langage, mais il semble s'agir de VC ++ .Net. J'ai donc recherché sur google. Ce lien devrait t'intéresser :
https://dotnet.developpez.com/faq/cppcli/?page=Multithreading#redirectoutputprocess
String ^ RedirectStdOutput(String ^nomProcess)
{
	System::Diagnostics::Process ^ proc = gcnew System::Diagnostics::Process();
	// On désactive le shell
	proc->StartInfo->UseShellExecute = false;
	// On redirige la sortie standard
	proc->StartInfo->RedirectStandardOutput = true;
	// On définit la commande 
	proc->StartInfo->FileName = nomProcess;
	// Démarrage de la commande
	proc->Start();
	// Attente de la fin de la commande
	proc->WaitForExit();
	// Lecture de la sortie de la commande
	String ^ output = proc->StandardOutput->ReadToEnd();
	// Libération des ressources
	proc->Close();
	return output;
}

0
Oui en effet j'ai utilisé cette solution dans un premier temps (mon premier post) mais le problème avec celle-ci c'est que la ligne de commande que je veux passer au terminal n'est pas exécutée, j'ai donc uniquement ça qui s'affiche:
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
D:\Documents and Settings\user\Bureau\blackDetect\blackDetect>


Ce que je passe en argument n'est pas pris en compte.

Merci pour ton aide fiddy
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
9 juin 2012 à 14:50
Malheureusement, je vais pas pouvoir t'aider plus. Je ne connais pas ce langage. Même si cela peut s'approcher parfois du C++, il faut chercher du côté de la fonction donnée ci-dessous (et pas regarder du côté de _popen à mon avis, ça sera pas propre). En espérant que tu trouves un spécialiste du C++.Net ;-)))
0