.NET GUI

.NET Community für WPF, Silverlight und mehr!
Willkommen bei .NET GUI. Anmeldung | Registrieren | Hilfe | Impressum | Forumsregeln
in Suchen

Prozessausgabe umleiten

Letzter Beitrag 06-08-2009 15:50 von moe. 8 Antworten.
Seite 1 von 1 (9 Treffer)
Beiträge sortieren: Zurück Weiter
  • 06-08-2009 14:31

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    Prozessausgabe umleiten

    Hallo zusammen.

    Ja, ich hab schon gegoogelt und ja, ich hab auch schon Antworten verschiedenster Art gefunden und ausprobiert: mit dem gleichen "Erfolg" --> es hat nicht funktioniert!
    Ich habe eine Win-Forms-Anwendung, aus der ich einen Batch in eigenem Prozess aufrufe:

            private void runProcessThread()
            {
                System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("halloWelt.bat");
                procStartInfo.UseShellExecute = false;
                procStartInfo.CreateNoWindow = false;
                procStartInfo.RedirectStandardOutput = true;
    
                p = new System.Diagnostics.Process();
                p.StartInfo = procStartInfo;
    
                p.EnableRaisingEvents = true;
                p.Exited += new EventHandler(p_Exited);
                p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
                
                p.Start();
                p.BeginOutputReadLine();
            }

    p ist "global" als Prozess deklariert!!! Der aufgerufene Batch gibt lediglich 3 Zeilen nach einander auf der Windows-Console aus, mit jeweils einer Sekunde Pause dazwischen!!!Wenn ich den Batch direkt aus der Win-Console aus aufrufe, dann funktioniert alles einwandfrei!

    Wie ihr sicherlich sehen könnt will ich meine Ausgabe umleiten:

                procStartInfo.RedirectStandardOutput = true;
    
                p.EnableRaisingEvents = true;
                p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
                
                p.BeginOutputReadLine();

    im p_OutputDataReceived-Handler will ich e.Data.ToString() einfach mal in der Console ausgeben!

            private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
            {
                if(e.Data != null)
                    Console.WriteLine(e.Data.ToString());
                //throw new NotImplementedException();
            }

    und jetzt kommts: Es geht nicht so wie ich es gerne hätte!!! Wie schon erwähnt gibt der Batch mir Zeilenweise mit einer Sekunde Abstand 3 Zeilen aus. So würde ich es auch erwarten, wenn ich den Batch via C# aus aufrufe. Wenn ich die Standardausgabe (procStartInfo.RedirectStandardOutput = false;) hernehme, dann zeigt es mir die Daten wie gewünscht im hochpoppenden Windows-Consolenfenster an, Zeile für Zeile mit Pause dazwischen. Aktiviere ich die Umleitung, habe ich das Problem, dass der Prozess erst bis zum Ende abgearbeitet wird und ERST DANN mir die Ausgabe machtgemacht wird...!!! Und zwar auf einmal und nicht mit einem Delay von jeweils 1 Sek!!!

    Ich habs schon mit verschiedenen Threads versucht, hab schon mit dem oben zu sehenden EventHandler gearbeitet und hab auch schon mit Deligates gearbeitet (s. unten)... ALLES OHNE ERFOLG. Ich verstehs nicht :(
    Dummerweise kann ich nicht zB. 5 Min warten, bis der Prozess abgearbeitet ist, sondern muss eventuelle Fehler oder Werte gleich haben und angezeigt bekommen, eben synchron!!!

    PLS HELP !!!

    if (fileName != null)
                {
                    Thread tRunProcess = new Thread(new ThreadStart(runProcessThread)); //runProcessThread wie oben im schon zu sehen
                    Thread tResultOutput = new Thread(new ThreadStart(resultOutput));
    
                    tRunProcess.Start();
    
                    // sleep this thread untill process is initialized
                    while (p == null)
                        Thread.Sleep(100);
    
                    tResultOutput.Start();
                }
                else
                {
                    MessageBox.Show("Please open first a file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
    private void resultOutput()
            {
                StreamReader output = p.StandardOutput;
    
                string str;
                while ((str = output.ReadLine()) != null)
                {
                    Console.WriteLine(str);
                    SetTextOutput(str);
                }
            }
            delegate void SetTextOutputCallback(string text);
            private void SetTextOutput(string text)
            {
                // InvokeRequired required compares the thread ID of the
                // calling thread to the thread ID of the creating thread.
                // If these threads are different, it returns true.
                if (this.InvokeRequired)
                {
                    SetTextOutputCallback d = new SetTextOutputCallback(SetTextOutput);
                    this.Invoke(d, text);
                }
                else
                {
                    textBox1.Text += text + Environment.NewLine;
                }
            }
    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 06-08-2009 14:58 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 980
    • Punkte 14.949
    • ForumsAdministrator

    AW: Prozessausgabe umleiten

    Hallo,

    also ich hab dein Anliegen nun wie folgt getestet:

    class Program
    {
        static void Main( string[ args )
        {
            Program prog = new Program();
            prog.DoWork();
        }
    
        public void DoWork()
        {
            ProcessStartInfo psi = new ProcessStartInfo( "C:\\execute.bat" );
            psi.CreateNoWindow = false;
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
    
            Process p = new Process();
            p.StartInfo = psi;
            p.OutputDataReceived += new DataReceivedEventHandler( p_OutputDataReceived );
    
            p.Start();
            p.BeginOutputReadLine();
    
            Console.ReadKey();
            
        }
    
        void p_OutputDataReceived( object sender, DataReceivedEventArgs e )
        {
            Console.WriteLine( e.Data );
        }
    }

    Mein Batch-File sieht so aus:

    dir c:\
    @ping 127.0.0.1 -n 2 -w 1000 > nul
    dir c:\

    Der Umweg über @ping, weil ich kein SLEEP auf meiner Maschine zur Verfügung hab.

    Die Ausgabe erscheint so, wie sie soll. D.h. die entsprechende Pause dazwischen und dann geht es weiter.

     

    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 06-08-2009 15:06 Antwort zu

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    AW: Prozessausgabe umleiten

    erstmal danke für die sau schnelle antwort!

    leider immer noch ohne erfolg!

    ich clicke auf meinen button und der prozess wird gestartet, aber ausgabe auf der console ist nach wie vor nicht wie erwünscht:

    process ended? --> True

    0 ---Hallo > Welt < ---

    1 ---Hallo > Welt < ---

    2 ---Hallo > Welt < ---

    3 ---Hallo > Welt < ---

    4 ---Hallo > Welt < ---

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 06-08-2009 15:19 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 980
    • Punkte 14.949
    • ForumsAdministrator

    AW: Prozessausgabe umleiten

    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 06-08-2009 15:22 Antwort zu

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    AW: Prozessausgabe umleiten

    au man, hör mir auf... ich hab jetzt lediglich das einfach so hin geschrieben, ohne threads oder sonst was... jetzt scheints zu gehen! ich werds gleich nochmal testen... das kann doch nicht sein... unglaublich!!! VOODOO
    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 06-08-2009 15:24 Antwort zu

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    AW: Prozessausgabe umleiten

    das war/ist mein batch

    @echo off
    echo nummer eins
    sleep 1
    echo nummer zwei
    sleep 1
    echo nummer drei
    sleep 1
    echo letzte nummer

    wie schon gesagt, passiert nicht viel!!! aber wieso es jetzt funktioniert... ich hab keinen schimmer!

    aber dem werd ich gleich noch nachgehen!!! ich packs echt nicht...! das kann doch net sein!

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 06-08-2009 15:29 Antwort zu

    • Norbert Eder
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 04-09-2008
    • Graz / Austria
    • Beiträge 980
    • Punkte 14.949
    • ForumsAdministrator

    AW: Prozessausgabe umleiten

    Vielleicht ist's meine Aura :)

    Auf jeden Fall gut, dass es jetzt funktioniert.

    • Beitragspunkte: 20
    • IP-Adresse ist Registriert
  • 06-08-2009 15:33 Antwort zu

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    AW: Prozessausgabe umleiten

    zum späßln ist das nicht, so langsam glaub ich das nämlcih auch :D

    ich hab echt KEINEN SCHIMMER was ich anderst gemacht hab... müsst nochmal meinen "code zurückspielen" und dann nochmal analysieren, aber warums jetzt geht... dass ist echt der wahn! ich sitz hier und denk mir ich bin zu blöd für den ganzen ro.. ähm *hüstel* dieses durchaus gut durchdachten teil der programmiersprache und dann sagst du mir bei dir gehts und ruck zuck gehts bei mir auch... das... ich weiß nimmer was sagen, echt!

    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
  • 06-08-2009 15:50 Antwort zu

    • moe
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 12-17-2008
    • Ulm
    • Beiträge 34
    • Punkte 470

    AW: Prozessausgabe umleiten

    ich könnt grad echt heulen: auf den vorherigen stand zurück gesetzt und den code wieder manuell angepasst (s. unten) und jetzt gehts schon wieder nimmer... *grml* jetzt scheint nichtmal der prozess richtig zu starten...!! ich krieg hier echt gleich ein kind!!! Devil

    aber wie es scheint hat es mit folgendem zu tun:

            private void executeScript()
            {
                if (fileName != null && fileName.Length > 0)
                {
                    Thread tRunProcess = new Thread(new ThreadStart(runProcessThread));
                    tRunProcess.Start();
                }
                else
                {
                    MessageBox.Show("Please open first a file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
     

    LOOOOOOOOOL
    was wäre, wenn cih dir jetzt sage, dass wenn ich die bedingung bzw den kompletten "if - else - block" auskommentiere es funktioniert, wenn ich den block drin hab, dann funktioniert es nicht...?!?!

    wohl gemerkt, der thread und trunprocess.start() bleibt als code stehen!!! (nicht auskommentiert)

    • Beitragspunkte: 5
    • IP-Adresse ist Registriert
Seite 1 von 1 (9 Treffer)
Powered by Community Server (Commercial Edition)    69° - Internet-Agentur München (CMS, ASP.NET, Webdesign)