www.mikrocontroller.net

Forum: PC-Programmierung Mehrere Prozesse nacheinander in C# ablaufen lassen


Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich will in C# "externe" Programme über die Process-Class triggern und 
deren Ausgabe mitplotten.
Dazu habe ich mir ein Modul geschrieben, dem ich nur den Programmnamen 
und die Parameter übergebe.
Die Umleitung des Standard-Error-Streams wird asynchron durchgeführt, um 
damit später einen Fortschrittsbalken zu füttern.

Das Problem ist jetzt, dass sich mein Programm mit einer Exeption 
("Nullreference"?!) aufhängt, sobald das zweite Programm gestartet 
werden soll.
Wo mache ich den Fehler? Ich bin quasi Neueinsteiger in C#, vermute 
aber, dass die DataReceivedEventHandler-Zuweisung das Problem ist - Kann 
aber auch falsch liegen...

Und bevor Meldungen kommen: "Ohne Code nichts los!"
        private void StartProcess(string ProcName, string Arguments)
        {
            ProcessStartInfo psi = new ProcessStartInfo(ProcName, Arguments);
            psi.RedirectStandardError = true;
            psi.RedirectStandardOutput = false;
            psi.UseShellExecute = false;
            psi.CreateNoWindow = true;
            Process p = new Process();

            //p.OutputDataReceived +=
            p.ErrorDataReceived +=
                new DataReceivedEventHandler(p_OutputDataReceived);
            p.StartInfo = psi;
            p.Start();
            p.BeginErrorReadLine();

            p.WaitForExit();
            p.Close();
        }

        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            //Debug.WriteLine(e.Data);

            DebugBox.AppendText(e.Data);
            using (StreamWriter writer = new StreamWriter(exportpath + "\\log.txt", true))
            {
                writer.WriteLine(e.Data);
            }

        }

Danke im Vorraus!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
> Und bevor Meldungen kommen: "Ohne Code nichts los!"
Und was ist mit der "UserToStupidToReportErrorException"... ?
Ich denke die genaue Fehlermeldung+Stacktrace könnte schon zur Lösung 
beitragen ;)
Ebenso wie du die Klasse aufrufst...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi .. schrieb:
> Und was ist mit der "UserToStupidToReportErrorException"... ?
> Ich denke die genaue Fehlermeldung+Stacktrace könnte schon zur Lösung
> beitragen ;)
> Ebenso wie du die Klasse aufrufst...

Aufruf:
            string parameter = "-i " + "\"" + GlobalerName + 
                "\"" + " -target dvd -y -b " + Convert.ToString(vbitrate)
                + "k " + exportpath + "tobeconverted.mpg";
            string dateiname = exportpath + "tobeconverted.mpg";

            // Mpeg in DVD-kompatible Größe schrumpfen
            StartProcess("ffmpeg", parameter);
            StartProcess("dvdauthor", "-v 4:3,720xfull -t -f " + exportpath + "tobeconverted.mpg  -o "+ exportpath + "temp");

Wenn ich den ersten Prozess ("ffmpeg") auskommentiere, funktioniert der 
Aufruf des zweiten problemlos.
Deswegen habe ich die "StartProcess" im Verdacht (und gepostet).

Wenn ich den Debugger laufen lasse, meckert er an einer anderen Stelle 
rum, un bei den zigtausend Meldungen von ffmpeg zieht sich der ganze 
Kram dann noch mehr in die Länge.

>Fehlermeldung+Stacktrace
Das, was im Bericht für Microsoft steht? Guck beim nächsten Absturz.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geht's:
        private void StartProcess(string ProcName, string Arguments)
        {
            ProcessStartInfo psi = new ProcessStartInfo(ProcName, Arguments);
            psi.RedirectStandardError = true;
            psi.RedirectStandardOutput = false;
            psi.UseShellExecute = false;
            psi.CreateNoWindow = true;
            Process p = new Process();

            //p.OutputDataReceived +=
            p.ErrorDataReceived +=
                new DataReceivedEventHandler(p_OutputDataReceived);
            p.StartInfo = psi;
            p.Start();
            p.BeginErrorReadLine();

            p.WaitForExit();
            p.ErrorDataReceived -=
                new DataReceivedEventHandler(p_OutputDataReceived);
            p.Close();

        }


Vermutlich könnte ich auch mit "Dispose" arbeiten.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daran lag es gar nicht.
Die "NullReferenceExeption" tritt erst in dem Moment auf, wenn die Daten 
des stdError-Streams in ein Textfeld geschrieben werden sollten.
Wenn der Prozess endete, wurde der EventHandler noch ein Mal aufgerufen.
Da ist das Objekt aber schon NULL...

Der Ablauf funktioniert also nun problemlos auf meinem Rechner.
Auf einem Zielrechner schmiert das Programm aber regelmäßig ab.
Woran kann das liegen?
Auf beiden Rechnern ist das gleiche .NET-Framework instlliert.
Kann mir da jemand eine Antwort geben? Ich wüsst enicht mal, wonach ich 
soll.
Danke im Vorraus!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest z.B: damit beginnen zu prüfen ob DataReceivedEventArgs 
ungleich null sind bevor du voller Optimissmus darauf zugreifst.
Ebenso wäre es sicher nicht verkehrt zu prüfen ob e.Data ungleich null 
und ungleich dem leeren String ist.

Wenn allerdings ein Constraint existiert, das diese Werte 
niemalsnicht null sein dürfen, solltest du den Bux fixen welcher dazu 
führt das hier Nullwerte eingegeben werden ;)

Möglichwerweise (ich hab die API jetzt nicht gelesen) signalisiert 
dieses "null" sogar das der Prozess nun beendet wurde...

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NullReference heißt das ein Objekt nicht initialisiert worden ist.
So z.b.:

class A
{ 
     public void blabla()
     { 

     }
}

//in main
A test;
//Das fehlt:
//test = new A();
test.blabla();


Schau mal wo dein Objekt Null ist und geh im Debugger durch warum.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte ich schon erwähnt, dass genau dieses Problem gelöst ist?
Ich frage inzwischen ab, ob das Objekt NULL ist.

>Schau mal wo dein Objekt Null ist und geh im Debugger durch warum.
Ich habe mir das mal mit dem Debugger angeguckt, aber irgendwie hat der 
die Anweisungen alle ignoriert.
Den StackTrace in eine Datei zu schreiben, war dann die Rettung.

Da scheinbar niemand die andere Frage liest, stelle ich sie hier noch 
mal:
Auf meinem Entwicklungsrechner funktioniert das Programm wie gewünscht, 
auf einem Zielrechner leider nicht.
Woran kann das liegen?
Auf beiden Rechnern ist das geiche .NET-Framwork installiert.

Autor: oliver.punk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, Du verlässt Dich drauf, dass das p_OutputDataReceived Handling vor 
dem Main Thread fertig ist. Eventuell solltest Du den Main Thread mit 
einem AutoResetEvent blockieren, welches Du in der Handler Methode 
freigibst. Ich kann das Problem nicht nachvollziehen und Dir daher nur 
"Cloud" Tips geben ;-).

Autor: STK500-Besitzer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Da ich scheinbar noch nicht in der Lage bin, qualifiziert eine Frage zu 
stellen, packe ich hier einfach mal funktionsfähigen Quellcode rein.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es liegt definitiv nicht an meinem Programm, da ein Test an 
verschiedenen anderen Computern ergeben hat, dass es wie gewünscht 
funktioniert.
Jetzt heisst es also: Programm richtig hübsch machen und Zielrechner für 
das Programm anpassen.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens kam der heutige/gestrige Betabetrieb bei den Benutzern sehr gut 
an.

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. je nach Anwenderkreis noch beachten: 
http://www.golem.de/1009/77825.html

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bluppdidupp schrieb:
> Evtl. je nach Anwenderkreis noch beachten:
> http://www.golem.de/1009/77825.html

Genau an dieser Problematik lag es:
Die auszuführenden Dateien und ihre DLL müssen alle mit im gleich 
Verzeichnis liegen, sofern sie nicht in der PATH-Systemvaribalen 
eingerichtet sind. Das waren sie malo, bis jemand den Rechner 
neugestartet hat...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.