Ich möchte gerne mehrere Prozesse hintereinander starten. Momentan startet er jeden Prozess gleichzeitig... Wie kann ich das richtig machen?
// create an open file dialog
OpenFileDialog dlgOpen = new OpenFileDialog();
string strFilter = "MPEG (*.mpg)|*.mpg|"
+ "AVI (*.avi)|*.avi|"
+ "Alle Dateien (*.*)|*.*)";
dlgOpen.Filter = strFilter;
// set properties for the dialog
dlgOpen.Title = "Select one or more files";
dlgOpen.ShowReadOnly = true;
dlgOpen.Multiselect = true;
string ffmpegPfad = "C:\\Mpeg2Wav";
// display the dialog and return results
if (dlgOpen.ShowDialog() == DialogResult.OK)
{
richTextBox1.Text = "Starte mit Konvertierung... ";
foreach (string s in dlgOpen.FileNames)
{
string wav_path = s.Substring(0, s.Length - 4);
startInfo = new ProcessStartInfo(ffmpegPfad + "\\ffmpeg.exe", " -i " + s + " " + wav_path + ".wav");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo);
richTextBox1.Text += "\n " + s;
}
richTextBox1.Text += "\n \n Fertig!";
}
}
Original von digi333
Wie kann ich das richtig machen?
Gar nicht. Du kannst blind dazwischen warten (z.B. 3 Sekunden), aber das ist entweder zu kurz, oder zu lange.
Bei selbstgeschriebenen Anwendungen wäre es möglich, dass sie dem startenden Prozess zurückmelden wenn sie laufen. Aber eine allgemeinen Lösung für alle Prozesse gibt es nicht.
Wie??? Kann man den Prozess nicht abfragen, ob er bereits gestartet ist?
if (Process.Start(startInfo).HasExited) und das ganze mit einer While-Schleife?
Original von digi333
Wie??? Kann man den Prozess nicht abfragen, ob er bereits gestartet ist?
Doch, aber der Prozess muss ein entsprechendes Interprozess-Kommunikations-Interface dafür bereit stellen. Es gibt dafür keinerlei standardisierte Lösung in Windows. Wie gesagt: Bei deinen eigenen Prozessen kannst du sowas leicht basteln, aber das funktioniert eben mit sonst nix.
Du kannst auch die Prozessliste pollen und wenn du den Prozess siehst, dann existiert er. Allerdings: Den siehst du fast sofort, auch wenn er dann noch 10 Sekunden braucht sich zu intialisieren, DLLs zu laden, etc.! Einsatzbereit und ohne Plattenzugriff (darum gehts ja), dafür gibts nix. Das weiss auch nur die Anwendung selbst...
Windows selbst kann das nicht und startet alle Autostarts quasi parallel. Mit der entsprechenden miserablen Performance. Deswegen beschleunigt Windows den Startvorgang, indem es ständig die Plattenzugriffe profiled und ein sequentielles "Image" der Hochfahrplattenzugriffe erstellt. Das lädt dann schneller durch. Also so eine Art Festplattencache für den Startvorgang.
Hallo digi333,
Ich möchte gerne mehrere Prozesse hintereinander starten. Momentan startet er jeden Prozess gleichzeitig.
wenn ich dich richtig verstehe, fehlt dir einfach ein Process.WaitForExit in der Schleife.
Allerdings musst du dann [FAQ] Warum blockiert mein GUI? beachten.
if (Process.Start(startInfo).HasExited) und das ganze mit einer While-Schleife?
Das ist Unsinn!
herbivore
Original von herbivore
wenn ich dich richtig verstehe, fehlt dir einfach ein Process.WaitForExit in der Schleife.
Wenn ich mir seinen Code anschaue, dann wird es das wohl sein. Ich hatte verstanden, dass er das Starten selbst sequentialisieren möchte um parallele Plattenzugriffe zu vermeiden.
Also WaitForExit().
Danke... das hab ich gesucht.
Da wurde auch schon das nächste Problem angesprochen... die Gui ist blockiert. Ich wollte eigentlich in einer textbox ausgeben, welche Datei gerade bearbeitet wird. Die Sache mit dem Thread ist mir aus Herbivores FAQ nicht ganz klar. Was macht in dem Zusammenhang die While-Schleife und wie könnte ich das bei mir einbauen?
Hallo digi333,
die Frage gehört nicht in diesen Thread. Außerdem wird sie in der FAQ ([FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)) ausführlich und inkl. Codebeispielen beantwortet. Damit solltest du es wirklich alleine hinbekommen. Bitte hier keine weiteren Nachfragen.
herbivore