none
[Résolu] Thread lent: redirection d'un output asynchrone

    Question

  • Bonjour,

    je suis en train de coder une petit programme qui exécute un programme et renvoie les données que celui-ci me transmet.

    Je peux également lancer l’exécutable à l'aide d'un fichier batch. Lorsque je lance l’exécutable avec le fichier bat, tout va bien et les informations renvoyées sont "fluides". Par la suite, lorsque je le lance via mon programme, les informations sont envoyées par "blocs". Les lignes ne sont pas imprimées unes par unes mais par groupes de 5 environ. De plus, après un certain nombre de lignes, il ne se passe plus rien. Comment cela se fait-il? Comment résoudre ce problème si possible?

    Pour information, l’exécutable que je lance n'a pas de fin et son exécution cesse uniquement lorsque je ferme le terminal (lorsque lancé via le fichier batch)

    Voici le code:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                
            }
    
            // Define static variables shared by class methods.
            private static StringBuilder sortOutput = null;
    
            public void startMiner(String fn, String arg)
            {
                var process = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = fn,
                        Arguments = arg,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
                };
                process.OutputDataReceived += new DataReceivedEventHandler(Process_OutputDataReceived);
                sortOutput = new StringBuilder("");
                process.Start();
    
                // Asynchronously read the standard output of the spawned process. 
                // This raises OutputDataReceived events for each line of output.
                process.BeginOutputReadLine();
    
                // Write the redirected output to this application's window.
            }
    
            void Process_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                if (!String.IsNullOrEmpty(e.Data))
                {
                        AppendTextBox(e.Data + Environment.NewLine);
                }
            }
    
            public void AppendTextBox(string value)
            {
                if (InvokeRequired)
                {
                    this.BeginInvoke(new Action<string>(AppendTextBox), new object[] { value });
                    return;
                }
                richTextBox1.Text += value;
            }
    
            public void button1_Click(object sender, EventArgs e)
            {
                if(string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text))
                {
                    MessageBox.Show("No!");
                }
                else
                {
                    String filename = textBox1.Text;
                    String arguments = textBox2.Text;
    
                    startMiner(filename, arguments);
                }
            }
        }


    Merci de votre aide!

    EDIT: Résolu!

    Pour arriver à afficher tous les élément, il me manquait les erreurs, la console renvoyait certaines infos sous formes d'erreurs: d'où l'arrêt brutal d'informations! 

    Voici le code solution:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                
            }
    
            // Define static variables shared by class methods.
            private static StringBuilder sortOutput = null;
    
            public void startMiner(String fn, String arg)
            {
                var process = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = fn,
                        Arguments = arg,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        CreateNoWindow = true
                    }
                };
                process.OutputDataReceived += new DataReceivedEventHandler(Process_OutputDataReceived);
                process.ErrorDataReceived += new DataReceivedEventHandler(Process_ErrorDataReceived);
                sortOutput = new StringBuilder("");
                process.Start();
    
                // Asynchronously read the standard output of the spawned process. 
                // This raises OutputDataReceived events for each line of output.
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
    
                // Write the redirected output to this application's window.
            }
    
            void Process_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                if (!String.IsNullOrEmpty(e.Data))
                {
                        AppendTextBox(e.Data + Environment.NewLine);
                }
            }
    
    
            void Process_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                if (!String.IsNullOrEmpty(e.Data))
                {
                    AppendTextBox(e.Data + Environment.NewLine);
                }
            }
    
            public void AppendTextBox(string value)
            {
                if (InvokeRequired)
                {
                    this.Invoke(new Action<string>(AppendTextBox), new object[] { value });
                    return;
                }
                richTextBox1.Text += value;
            }
    
            public void button1_Click(object sender, EventArgs e)
            {
                if(string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text))
                {
                    MessageBox.Show("No!");
                }
                else
                {
                    String filename = textBox1.Text;
                    String arguments = textBox2.Text;
    
                    startMiner(filename, arguments);
                }
            }
        }




     
    • Modifié amatokus dimanche 28 mai 2017 20:51
    dimanche 28 mai 2017 15:36

Réponses


  • EDIT: Résolu!

    Pour arriver à afficher tous les élément, il me manquait les erreurs, la console renvoyait certaines infos sous formes d'erreurs: d'où l'arrêt brutal d'informations! 

    Voici le code solution:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                
            }
    
            // Define static variables shared by class methods.
            private static StringBuilder sortOutput = null;
    
            public void startMiner(String fn, String arg)
            {
                var process = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = fn,
                        Arguments = arg,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        CreateNoWindow = true
                    }
                };
                process.OutputDataReceived += new DataReceivedEventHandler(Process_OutputDataReceived);
                process.ErrorDataReceived += new DataReceivedEventHandler(Process_ErrorDataReceived);
                sortOutput = new StringBuilder("");
                process.Start();
    
                // Asynchronously read the standard output of the spawned process. 
                // This raises OutputDataReceived events for each line of output.
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
    
                // Write the redirected output to this application's window.
            }
    
            void Process_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                if (!String.IsNullOrEmpty(e.Data))
                {
                        AppendTextBox(e.Data + Environment.NewLine);
                }
            }
    
    
            void Process_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
            {
                if (!String.IsNullOrEmpty(e.Data))
                {
                    AppendTextBox(e.Data + Environment.NewLine);
                }
            }
    
            public void AppendTextBox(string value)
            {
                if (InvokeRequired)
                {
                    this.Invoke(new Action<string>(AppendTextBox), new object[] { value });
                    return;
                }
                richTextBox1.Text += value;
            }
    
            public void button1_Click(object sender, EventArgs e)
            {
                if(string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text))
                {
                    MessageBox.Show("No!");
                }
                else
                {
                    String filename = textBox1.Text;
                    String arguments = textBox2.Text;
    
                    startMiner(filename, arguments);
                }
            }
        }


    Bonjour amatokus,

    Je vous remercie d'avoir partagé cette solution avec la communauté du forum.

    Cordialement,

    Nina



    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 29 mai 2017 11:32
    Modérateur