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


von STK500-Besitzer (Gast)


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!"
1
        private void StartProcess(string ProcName, string Arguments)
2
        {
3
            ProcessStartInfo psi = new ProcessStartInfo(ProcName, Arguments);
4
            psi.RedirectStandardError = true;
5
            psi.RedirectStandardOutput = false;
6
            psi.UseShellExecute = false;
7
            psi.CreateNoWindow = true;
8
            Process p = new Process();
9
10
            //p.OutputDataReceived +=
11
            p.ErrorDataReceived +=
12
                new DataReceivedEventHandler(p_OutputDataReceived);
13
            p.StartInfo = psi;
14
            p.Start();
15
            p.BeginErrorReadLine();
16
17
            p.WaitForExit();
18
            p.Close();
19
        }
20
21
        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
22
        {
23
            //Debug.WriteLine(e.Data);
24
25
            DebugBox.AppendText(e.Data);
26
            using (StreamWriter writer = new StreamWriter(exportpath + "\\log.txt", true))
27
            {
28
                writer.WriteLine(e.Data);
29
            }
30
31
        }

Danke im Vorraus!

von Läubi .. (laeubi) Benutzerseite


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...

von STK500-Besitzer (Gast)


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:
1
            string parameter = "-i " + "\"" + GlobalerName + 
2
                "\"" + " -target dvd -y -b " + Convert.ToString(vbitrate)
3
                + "k " + exportpath + "tobeconverted.mpg";
4
            string dateiname = exportpath + "tobeconverted.mpg";
5
6
            // Mpeg in DVD-kompatible Größe schrumpfen
7
            StartProcess("ffmpeg", parameter);
8
            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.

von STK500-Besitzer (Gast)


Lesenswert?

So geht's:
1
        private void StartProcess(string ProcName, string Arguments)
2
        {
3
            ProcessStartInfo psi = new ProcessStartInfo(ProcName, Arguments);
4
            psi.RedirectStandardError = true;
5
            psi.RedirectStandardOutput = false;
6
            psi.UseShellExecute = false;
7
            psi.CreateNoWindow = true;
8
            Process p = new Process();
9
10
            //p.OutputDataReceived +=
11
            p.ErrorDataReceived +=
12
                new DataReceivedEventHandler(p_OutputDataReceived);
13
            p.StartInfo = psi;
14
            p.Start();
15
            p.BeginErrorReadLine();
16
17
            p.WaitForExit();
18
            p.ErrorDataReceived -=
19
                new DataReceivedEventHandler(p_OutputDataReceived);
20
            p.Close();
21
22
        }

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

von STK500-Besitzer (Gast)


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!

von Läubi .. (laeubi) Benutzerseite


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...

von Sam .. (sam1994)


Lesenswert?

NullReference heißt das ein Objekt nicht initialisiert worden ist.
So z.b.:
1
class A
2
{ 
3
     public void blabla()
4
     { 
5
6
     }
7
}
8
9
//in main
10
A test;
11
//Das fehlt:
12
//test = new A();
13
test.blabla();

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

von STK500-Besitzer (Gast)


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.

von oliver.punk (Gast)


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 ;-).

von STK500-Besitzer (Gast)


Angehängte Dateien:

Lesenswert?

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

von STK500-Besitzer (Gast)


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.

von STK500-Besitzer (Gast)


Lesenswert?

Übrigens kam der heutige/gestrige Betabetrieb bei den Benutzern sehr gut 
an.

von bluppdidupp (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.