Programm Reset / Neustart



  • ich bin ja eigentlich mehr der mikrocontroller programmieren und vermiss grad mein watchdog 🙂
    wie kann ich mein programm neustarten, wenn z.b. einstellungen in meiner "ini" vorgenommen wurden?

    edit: windows, konsolenanwendung



  • sash schrieb:

    ...watchdog ...

    den hast Du aber auch nicht mit Standard-C++-Mitteln geschrieben, oder ? 😉

    Das Starten von Programmen gehört zu den Aufgaben eines Betriebssystems und wird deswegen vom C++-Standard nicht beschrieben.
    Du kannst (solltest) aber das gezielte Programmende in Deinem Programm vorsehen. Dazu musst Du irgendein "Signal" von außer abfragen; das kann entweder ein Dateiinhalt, eine Konsoleneingabe, ein OS-spezifisches Signal (wie SIG_TERM, ...), oder etwas, das über Netzwerk kommt, ..... sein.
    Auf jeden Fall solltest Du "regelmäßig" auf dieses Signal lauschen und dann gezielt runterfahren.

    Gruß,

    Simon2.



  • hardware watchdog^^

    mal bissle genauer zu meinem problem.
    hab ein programm welches daten von der seriellen schnittstelle einliesst und in einem logfile speicher.

    bei programmstart wird aus einem inifile z.b. die portnummer gelesen.
    kann dieser port nicht geoeffnet werden erscheint eine meldung mit der man das programm beenden kann oder die einstellungen neu vornehmen. bei letzterem moechte ich anschliessend das programm wieder ganz vom anfang loslaufen lassen.
    ich koennte dies mit zwei while schleifen loesen, und in denen meine ganze initialisieren unterbringen, finde die loesung aber nicht so "schoen"



  • Also ich fände eher die Lösung des Neustarts "unschön" 😉 Du kannst einfach die Windows-Funktion ShellExecute(Ex) aufrufen, um dein Programm zu starten, direkt danach solltest du es dann beenden, in etwa so:

    int main( char*[] args, int argc )
    {
        LoadConfig( .. )
        if ( ! IsPortOpen() )
        {
            cout << "Neu starten oder konfigurieren?" << endl;
            cin >> irgendwas;
            if ( neustarten )
                ShellExecuteEx( args[0], ... );
            return 0;
        }
    }
    

    Stattdessen könntest du aber auch die Ini-Datei "starten", also im Editor anzeigen lassen und sobald der geschlossen ist, liest du neu ein. In etwa so:

    LoadConfig(...);
        OpenPort( ... );
        while ( ! IsPortOpen() )
        {
            cout << "Konfigurieren oder beenden?" << endl;
            cin >> irgendwas;
            if ( beenden )
                return 0;
            ShellExecuteEx( "Bla.ini", ... );
            while ( editor_running )
                Sleep( 1 );
            LoadConfig( ... );
            OpenPort(... );
        }
    

    Ist natürlich alles Pseudo-Code 🙂



  • Wie wäre es, wenn Du eine Batchdatei schreibst mit folgendem Inhalt:

    :: Sinnlose Beschäftigung für eine kurze Pause
    
    ping -n 2 -w 5000 localhost  > nul
    
    :: Programm neustarten
    
    "%CD%\programm.exe" parameter
    

    Dann kannst Du einfach mit einem "hässlichen" system() dein Programm neustarten:

    system("./neustart.bat");
    exit(); //bzw. return 0;
    

    Unsauber, aber müsste funktionieren 🙂



  • Und schon hast du eine Rekursion auf Systemebene eingeführt - system() kehrt erst zurück, wenn das aufgerufene Programm sich beendet hat.

    PS: Ich würde eine while-Schleife im main() auch für die sauberere Lösung halten. Alternativ könntest du auch den User direkt nach einem Ersatz-Port fragen, wenn der aus dem Ini-File nicht funktioniert.



  • also danke fuer die antworten.
    ich werde mich dann doch fuer die while schleife entscheiden. vielleicht wirds ja doch nicht so wild aus, wie ich anfangs dachte



  • sash schrieb:

    also danke fuer die antworten.
    ich werde mich dann doch fuer die while schleife entscheiden. vielleicht wirds ja doch nicht so wild aus, wie ich anfangs dachte

    Gut 🙂 👍

    Noch eine kleine Erläuterung zum while ( editor_running ) : Der ShellExecuteEx-Funktion übergibst du eine Struktur "SHELLEXECUTEINFO". Wenn die ShellExecuteEx-Funktion zurückkommt, ist die Variable "hInstApp" der Struktur ein Handle für den Editor (oder ein Fehler-Code, falls die Funktion fehlschlägt). Mit "WaitForSingleObject( struktur.hInstApp, INFINITE )" kannst du dann darauf warten, dass der Editor geschlossen wird, dann brauchst du auch keine while-Schleife mehr dafür 🙂



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply