Laden...

Processe nacheinander starten in Schleife

Erstellt von digi333 vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.784 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren
Processe nacheinander starten in Schleife

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!";
            }
        }

S
8.746 Beiträge seit 2005
vor 16 Jahren

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.

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

Wie??? Kann man den Prozess nicht abfragen, ob er bereits gestartet ist?

if (Process.Start(startInfo).HasExited) und das ganze mit einer While-Schleife?

S
8.746 Beiträge seit 2005
vor 16 Jahren

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.

49.485 Beiträge seit 2005
vor 16 Jahren

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

S
8.746 Beiträge seit 2005
vor 16 Jahren

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

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

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?

49.485 Beiträge seit 2005
vor 16 Jahren

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