2010-09-09 20 views
0

J'ai une application basée sur la console. Je l'exécute à partir de C# silencieusement en utilisant Rediriger la sortie standard et en le faisant de manière synchrone, ce qui fonctionne bien. Maintenant, je veux le faire de manière asynchrone, ce qui donne la sortie comme la manière de synchronisation. i.e L'événement OutPutDataRecieved est déclenché, mais seulement après la fin de l'application de la console (exe). L'événement OutputDataRecieved est déclenché pour chaque ligne après la fin, pas instantanément dès qu'il reçoit une ligne en sortie.Lecture de StdOut Asynch à partir d'une application de console c

Le code pour asynch fonctionne pour CMD.exe etc, donc, je suis sûr que son application basée sur c ayant un problème de sortie. FYI: La sortie dans la console c est effectuée en utilisant printf. Basé sur mes résultats: Je pense que l'application de console c ne donne pas de sortie/écriture à stdout jusqu'à ce qu'il termine son exécution. J'ai essayé de mettre le tampon à zéro ou de le rincer après chaque printf mais aucun ne fonctionne.

Des trucs ??

+0

Vous vous souciez de publier le bit pertinent de votre code C#? –

+0

Avez-vous la source pour les applications 'C' et C#? Cela aiderait peut-être si vous montriez les parties pertinentes. – pmg

+0

Lorsque vous dites que vous avez défini le tampon sur null, utilisez-vous la fonction setvbuf? –

Répondre

1

Vous pouvez désactiver la mise en mémoire tampon à l'aide de setvbuf.

Voici un exemple rapide, si vous supprimez l'appel à setvbuf, le contenu redirigé n'est écrit qu'une fois que vous avez appuyé sur Entrée (en attente de la commande getchar()). Avec le setvbuf, la chaîne est écrite directement dans le flux redirigé.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    setvbuf(stdout, NULL,_IONBF, 0); 
    printf("Hello"); 
    getchar(); 
    return 0; 
} 
2

Merci l'homme. Cela a fonctionné comme un charme. J'utilisais setbuf pour définir la valeur nulle du tampon.

Vraiment apprécier les efforts de tous vous guyz.

Pour l'info d'autres guyz, c'était mon code C# qui est disponible sur les forums internet et aussi.

 string command = @"Output.exe"; 
    string arguments = "hellotext"; 

    ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

    // Redirect the standard output of the process. 
    info.RedirectStandardOutput = true; 
    info.RedirectStandardError = true; 

    // Set UseShellExecute to false for redirection 
    info.UseShellExecute = false; 

    Process proc = new Process(); 
    proc.StartInfo = info; 
    proc.EnableRaisingEvents = true; 

    // Set our event handler to asynchronously read the sort output. 
    proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
    proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
    proc.Exited += new EventHandler(proc_Exited); 

    proc.Start(); 
    // Start the asynchronous read of the sort output stream. Note this line! 
    proc.BeginOutputReadLine(); 
    proc.BeginErrorReadLine(); 

    proc.WaitForExit(); 

    Console.WriteLine("Exited (Main)"); 

} 

static void proc_Exited(object sender, EventArgs e) 
{ 

    Console.WriteLine("Exited (Event)"); 
} 



static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.WriteLine("Error: {0}", e.Data); 
} 



static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.WriteLine("Output data: {0}", e.Data); 
} 
+0

@ user445066, je suis heureux que cela a aidé. –