Laden...

Externer Prozess Rückmeldung in Gui

Erstellt von smoochy vor einem Jahr Letzter Beitrag vor einem Jahr 707 Views
S
smoochy Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr
Externer Prozess Rückmeldung in Gui

Hallo Leute!
Ich bin auf der Suche nach einer Lösung zu meinem Problem. Ich habe eine GUI für einen Bootloader eines µC geschrieben. Ich starte einen externen asynchronen Prozess mit Argumenten und bekomme anschließend ein Ergebnis zurück, das funktioniert wunderbar, allerdings dauert das eine Zeit bis ich die Rückmeldung bekomme ob alles Funktioniert hat.
Ich würde nun gerne irgendwie eine Zyklische Rückmeldung von meinem Prozess aus dem OutputHandler bekommen (die er generiert, bzw. in der IDE in der Console sehe). Leider reichen meine Programmierkenntnisse dazu noch nicht aus. Kann mir jemand helfen.
Grüße
MArtin


private void Firmwareupdate()
        {int timeout = 60 * 1000;
            string fileString = "myprogram.exe";
            string arguments = " " + Argument1 + Argument2  + Argument3 + txtFile.Text;
            Cursor.Current = Cursors.WaitCursor;
            ProcessStartInfo startInfo = new ProcessStartInfo(fileString);
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.CreateNoWindow = true;
            startInfo.Arguments = arguments;
            cmdOutput.Clear();
            rTBFWUpdate.Clear();

            using (cmdProcess = new Process())
            {
                cmdProcess.StartInfo = startInfo;
                cmdProcess.OutputDataReceived += new DataReceivedEventHandler(EventOutputHandler);
                try
                {
                    cmdProcess.Start();
                    cmdProcess.BeginOutputReadLine();
                    cmdProcess.WaitForExit(timeout);

                    rTBFWUpdate.AppendText(cmdOutput.ToString());
                    Cursor.Current = Cursors.Default;
                    if (!cmdProcess.HasExited)
                    {
                        rTBFWUpdate.AppendText("Timeout \n\r ERROR");
                        cmdProcess.Kill();
                    }
                    cmdProcess.Close();
                }
                catch (Exception ex)
                {
                    rTBFWUpdate.Text = ex.ToString();
                    cmdProcess.Kill();
                    cmdProcess.Close();
                }

            }

        }

        private void EventOutputHandler(object cmdProcess, DataReceivedEventArgs outLine)
        {   
            if (!String.IsNullOrEmpty(outLine.Data))
            {
#if DEBUG
                Console.WriteLine(outLine.Data);
#endif
                if (outLine.Data.Contains("ERROR") || outLine.Data.Contains("READ"))
                {
                    cmdOutput.Append(Environment.NewLine + outLine.Data);
                }
                if (outLine.Data.Contains("FLASH") && outLine.Data.Contains("OK"))
                {
                    cmdOutput.Append(Environment.NewLine + "FLASH WRITE   ... OK" + Environment.NewLine + "DONE...");
                }
            }
        }


4.939 Beiträge seit 2008
vor einem Jahr

Hallo und willkommen,

für eine reine Konsolenanwendung wäre dein Code so (einigermaßen) in Ordnung. Bei einer GUI-Anwendung darfst du jedoch niemals den UI-Thread blockieren (z.B. mit cmdProcess.WaitForExit(timeout)), s. [FAQ] Warum blockiert mein GUI?

Verwende das Process.Exited-Ereignis, um auf das Beenden zu warten.

S
smoochy Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Danke für den Hinweis, allerdings benötige ich dann erst recht eine Rückmeldung vom Task, sonst weiß der Benutzer ja gar nicht dass da irgendetwas im Hintergrund passiert.

G
154 Beiträge seit 2015
vor einem Jahr

Das Warten auf den Prozess blockiert den GUI Thread, daher der Verweis auf die FAQ. Du musst, wie in der FAQ beschrieben, das Starten und Warten auf das Ende des Prozesses in einen Task auslagern und die Ausgabe des Events dann über den GUI-Thread ausgeben.

Und beachten, dass der User den Prozess wahrscheinlich nicht mehrfach starten können soll.

S
smoochy Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Danke ich hab es mit dem Backgroundworker geschafft. Funktioniert alles wunderbar.

16.834 Beiträge seit 2008
vor einem Jahr

Der Backgroundworker gehört eigentlich in die Mottenkiste.
Würde man heutzutage mit Tasks machen.

Task.Run zusammen mit asynchroner Programmierung.