Restart Programm



  • Hallo liebe Community,

    Ich habe folgendes vor:

    Ich möchte ein Programm schreiben wo es möglich ist über ein Diolog Fenster eine Datei auszuwählen (.exe) und diese über einen Button zu starten und durch eine Check Box den Automatischen Restart einzuschalten wenn das Programm beendet oder abgestürzt ist. Sprich sobald das gestartet Programm nicht mehr reagiert oder manuell geschlossen wurde das Automatisch nach 2-3 Sekunden das Programm Automatisch wieder gestartet wird.

    Ich muss dazu sagen das ich mich grade erst in C# einlese und viel Googel. Ich weis nur nich wie ich das umsetzen kann mit der Erkennung ob das Programm läuft oder nicht. Einen Prozess zu Starten der ausgewählt wurde ist kein Problem. Nur wie kann ich nun festlegen wann das Programm offen ist und wann nicht. Vieleicht über eine Boolische Variable? Sprich running=true wenn false dann starten nur ich weis nicht wie ich den Prozess da mit einbinden soll. Denn alles was ich bisher gefunden habe bezieht sich immer auf einen im Code festgelegten Prozess. Das ist ja aber nicht der fall da man den Prozess neu wählen kann. Wenn man das Programm startet.

    Danke schonmal für die Antworten.



  • Wie kommst du darauf, wir wären eine Community, oder gar lieb?

    Schau dir die Process Klasse an, die hat eine WaitForExit Methode.



  • Wie du rausbekommst ob der Prozess beendet wurde hat Mechanics ja schon geschrieben.
    (Bzw. wenn du es pollen willst/musst, dann kannst du Process.HasExited nehmen. Und den Process.Exited Event gibt's natürlich auch noch.)

    Rauszubekommen ob ein Programm "nicht mehr reagiert" ist dagegen schon etwas schwieriger.
    Dazu müsste man wohl alle top-level Fenster des Prozesses auflisten, und dann an jedes mit SendMessageTimeout eine Dummy-Message schicken (z.B. WM_NULL ) -- mit den nötigen Parametern (z.B. SMTO_ABORTIFHUNG ). Bin aber fast sicher dass es dazu keine .NET Framework Funktionen gibt, d.h. man müsste es mittels PInvoke machen.

    Das ist keine Hexerei, aber wenn du dich gerade erst in C# einliest und (Vermutung) auch keine WinAPI Grundlagenkenntnisse hast, dann ist es schon eine kleine Herausforderung.



  • Danke Mechanics und auch hustbaer für die Antwort. Ich werde mich mal mit der WaitForExit Methode vertraut machen. Nur finde ich schade WIE man eine Antwort bekommt... dennoch danke



  • Gut ich habe es hinbekommen das Mein Programm das tut was ich möchte. Nur ich stehe jetzt vor dem Nächsten Hinderniss...

    Ich möchte das man insgesammt 6 verschiedene Programme dort auswählen kann. Jeweils 2 werden zusammen über eine Checkbox aktiviert und gestartet. Das problem ist. Wenn ich die ersten beiden Programme starte über die checkbox wird das MainForm fenster Quasi Inaktiv. Bedeutet das ich die anderen Checkboxen nicht Aktivieren kann.

    Ich würde ja ein Code beispiel meines Programms hier Posten doch nach der Art wie ich Antworten bekommen habe lasse ich das lieber sein. Ich möchte nicht noch irgentwie blöd angemacht werden weil ich hilfe suche...



  • Das ist der übliche Umgangston in einem Programmierforum, außerdem versteh ich dein Problem echt nicht. Beziehst du dich auf die Antwort von mir? Einerseits war das ein Witz und sollte dich in keiner Weise beleidigt haben. Hier sieht man ständig wesentlich "schlimmeres". Wirklich "höfliche" Umgangsformen wirst du in einem Programmierforum wohl kaum finden. Schon mal paar Beiträge von Linus Torvalds gelesen? Haufen masturbierender Affen und so... Außerdem hab ich einfach gesagt, was mir in den Sinn gekommen ist. Ich seh das ganze tatsächlich nicht als "Community", und wir sind auch nicht hier, um lieb zu sein, siehe oben 😉

    WaitForExit blockiert natürlich den Thread, der das aufruft. Der Thread wartet darauf, dass die Funktion zurückkommt, und kann währenddessen nichts anderes machen, auch keine UI Events verarbeiten. Du musst den Prozess aus einem anderen Thread heraus starten.



  • Hab ja gesagt das ich grade dabei bin mir c# anzueignen. Somit war ich auch noch nicht viel in Programmierer Foren unterwegs :). Als beleidigung habe ich es jetzt nicht gesehen. Hat eher ein bisschen abschreckend gewirkt. Aber nunja auch egal.

    Okay ich werde noch ein bisschen rumprobieren mit dem WaitForExit 😉 Danke für den Tipp



  • Es gibt wie gesagt auch noch den Process.Exited Event. Bei dem kannst du dich einklingen, und dann wirst du aufgerufen wenn der Prozess sich beendet hat.
    Im Event-Handler solltest du dann noch ein Control.BeginInvoke in den GUI-Thread machen, und schon hast du eine Lösung die ganze ohne blockierte Threads auskommt.

    @Mechanics
    "Wie kommst du darauf dass" wirkt schon ein bisschen vorwurfsvoll.



  • Hat alles wunderbar Funktioniert. Das Programm steht und jetzt beginnt das aufhüpschen. Vielen dank für die kleinen Tipps. Ich glaube ohne die hätte ich mich tot gegoogelt 🙂

    Hier das fertige Produkt.

    Ich kann mir vorstellen das ich es mir ziemlich Schwer gemacht habe. Aber es funktioniert ^^

    using System;
    using System.Diagnostics;
    using System.Threading;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Restarter
    {
        public partial class MainForm : Form
        {
            Process world1;
            Process login1;
            Process world2;
            Process login2;
            Process world3;
            Process login3;
    
            public MainForm()
            {
                InitializeComponent();
            }
    
            private void world1_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationWorld1.Text = fbd.FileName;
            }
    
            private void login1_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationLogin1.Text = fbd.FileName;
            }
    
            private void world2_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationWorld2.Text = fbd.FileName;
            }
    
            private void login2_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationLogin2.Text = fbd.FileName;
            }
    
            private void world3_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationWorld3.Text = fbd.FileName;
            }
    
            private void login3_browse_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog fbd = new OpenFileDialog())
                    if (fbd.ShowDialog() == DialogResult.OK)
                        locationLogin3.Text = fbd.FileName;
            }
    
            private void soloStart1_Click(object sender, EventArgs e)
            {
    
                try
                {
    
                    string locationWorld = locationWorld1.Text;
                    string locationLogin = locationLogin1.Text;
                    world1 = Process.Start(locationWorld);
                    login1 = Process.Start(locationLogin);
    
                }
                catch (Exception)
                {
                    MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                }
    
            }
            private void soloStart2_Click(object sender, EventArgs e)
            {
    
                try
                {
    
                    string locationWorld = locationWorld2.Text;
                    string locationLogin = locationLogin2.Text;
                    world2 = Process.Start(locationWorld);
                    login2 = Process.Start(locationLogin);
    
                }
                catch (Exception)
                {
                    MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                }
            }
            private void soloStart3_Click(object sender, EventArgs e)
            {
    
                try
                {
    
                    string locationWorld = locationWorld3.Text;
                    string locationLogin = locationLogin3.Text;
                    world3 = Process.Start(locationWorld);
                    login3 = Process.Start(locationLogin);
    
                }
                catch (Exception)
                {
                    MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                }
            }
    
            private void autoRestart1_CheckedChanged(object sender, EventArgs e)
            {
                if (autoRestart1.Checked == true)
                {
                    try
                    {
                        string locWorld1 = locationWorld1.Text;
                        string locLogin1 = locationLogin1.Text;
    
                        world1 = Process.Start(locWorld1);
                        login1 = Process.Start(locLogin1);
    
                        world1.EnableRaisingEvents = true;
                        login1.EnableRaisingEvents = true;
    
                        world1.Exited += new EventHandler(world1_closed);
                        login1.Exited += new EventHandler(login1_closed);
                        autoRestart1_running.ForeColor = Color.Green;
                        autoRestart1_running.Text = "Server 1 Restarter Läuft.";
    
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                    }
                }
                if (autoRestart1.Checked == false)
                {
                    autoRestart1_running.ForeColor = Color.Red;
                    autoRestart1_running.Text = "Server 1 Restarter Beendet.";
                }
            }
            private void autoRestart2_CheckedChanged(object sender, EventArgs e)
            {
                if (autoRestart2.Checked == true)
                {
                    try
                    {
                        string locWorld2 = locationWorld2.Text;
                        string locLogin2 = locationLogin2.Text;
    
                        world2 = Process.Start(locWorld2);
                        login2 = Process.Start(locLogin2);
    
                        world2.EnableRaisingEvents = true;
                        login2.EnableRaisingEvents = true;
    
                        world2.Exited += new EventHandler(world2_closed);
                        login2.Exited += new EventHandler(login2_closed);
                        autoRestart2_running.ForeColor = Color.Green;
                        autoRestart2_running.Text = "Server 2 Restarter Läuft.";
    
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                    } 
                }
                if (autoRestart2.Checked == false)
                {
                    autoRestart2_running.ForeColor = Color.Red;
                    autoRestart2_running.Text = "Server 2 Restarter Beendet.";
                }
            }
            private void autoRestart3_CheckedChanged(object sender, EventArgs e)
            {
                if (autoRestart3.Checked == true)
                {
                    try
                    {
                        string locWorld3 = locationWorld3.Text;
                        string locLogin3 = locationLogin3.Text;
    
                        world3 = Process.Start(locWorld3);
                        login3 = Process.Start(locLogin3);
    
                        world3.EnableRaisingEvents = true;
                        login3.EnableRaisingEvents = true;
    
                        world3.Exited += new EventHandler(world3_closed);
                        login3.Exited += new EventHandler(login3_closed);
                        autoRestart3_running.ForeColor = Color.Green;
                        autoRestart3_running.Text = "Server 3 Restarter Läuft.";
    
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Bitte wähle einen Pfad für deine Server.");
                    } 
                }
                if (autoRestart3.Checked == false)
                {
                    autoRestart3_running.ForeColor = Color.Red;
                    autoRestart3_running.Text = "Server 3 Restarter Beendet.";
                }
            }  
    
            private void world1_closed(object sender, EventArgs e)
            {
                bool world1_running = true;
                world1_running = false;
                while (world1_running == false)
                {
                    if (autoRestart1.Checked == false)
                    {
                        break;
                    }
                    string locationWorld = locationWorld1.Text;
                    world1 = Process.Start(locationWorld);
                    world1.EnableRaisingEvents = true;
                    world1.Exited += new EventHandler(world1_closed);
                    world1.WaitForExit();
    
                }
            }
            private void login1_closed(object sender, EventArgs e)
            {
                bool login1_running = true;
                login1_running = false;
                while (login1_running == false)
                {
                    if (autoRestart1.Checked == false)
                    {
                        break;
                    }
                    string locationLogin = locationLogin1.Text;
                    login1 = Process.Start(locationLogin);
                    login1.EnableRaisingEvents = true;
                    login1.Exited += new EventHandler(login1_closed);
                    login1.WaitForExit();
                }
            }
            private void world2_closed(object sender, EventArgs e)
            {
                bool world2_running = true;
                world2_running = false;
                while (world2_running == false)
                {
                    if (autoRestart2.Checked == false)
                    {
                        break;
                    }
                    string locationWorld = locationWorld2.Text;
                    world2 = Process.Start(locationWorld);
                    world2.EnableRaisingEvents = true;
                    world2.Exited += new EventHandler(world2_closed);
                    world2.WaitForExit();
                }
            }
            private void login2_closed(object sender, EventArgs e)
            {
                bool login2_running = true;
                login2_running = false;
                while (login2_running == false)
                {
                    if (autoRestart2.Checked == false)
                    {
                        break;
                    }
                    string locationLogin = locationLogin2.Text;
                    login2 = Process.Start(locationLogin);
                    login2.EnableRaisingEvents = true;
                    login2.Exited += new EventHandler(login2_closed);
                    login2.WaitForExit();
                }
            }
            private void world3_closed(object sender, EventArgs e)
            {
                bool world3_running = true;
                world3_running = false;
                while (world3_running == false)
                {
                    if (autoRestart3.Checked == false)
                    {
                        break;
                    }
                    string locationWorld = locationWorld3.Text;
                    world3 = Process.Start(locationWorld);
                    world3.EnableRaisingEvents = true;
                    world3.Exited += new EventHandler(world3_closed);
                    world3.WaitForExit();
                }
            }
            private void login3_closed(object sender, EventArgs e)
            {
                bool login3_running = true;
                login3_running = false;
                while (login3_running == false)
                {
                    if (autoRestart3.Checked == false)
                    {
                        break;
                    }
                    string locationLogin = locationLogin3.Text;
                    login3 = Process.Start(locationLogin);
                    login3.EnableRaisingEvents = true;
                    login3.Exited += new EventHandler(login3_closed);
                    login3.WaitForExit();
                }
            }
        }
    
    }
    


  • Das sieht auf jeden Fall so aus, als ob man da was verallgemeinern/zusammenfassen könnte. Habs mir nicht genau angeschaut, aber die ganzen durchnummerierten Funktionen schauen ziemlich gleich aus, nur greifen die auf unterschiedliche, ebenfalls durchnummerierte Controls zu. Das kann man sehr wahrscheinlich zusammenfassen.
    Bin mir nur nicht 100% sicher, ob sich das lohnt. Grundsätzlich sollte man gleich darauf achten, dass man keinen Code dupliziert und Abstraktionen erkennt. Andererseits könnte man bei den paar Zeilen Code auch sagen, Abstraktionen sind nicht so wichtig, die würden das nur komplexer machen. Musst du entscheiden.



  • Es sind im Prinzip nur 2 Funktionen die ich auf insgesammt 3 auszuführende Programme verteilt habe und die jeweiligen variablen so angepasst habe das man versteht das es die funktion zu dem jeweiligen programm ist. Ein Normaler Start des Programms und ein Start über eine While schleife. Ich bin froh das ich es überhaupt hinbekommen habe 🙂


Log in to reply