Programm sofort abbrechen/beenden



  • hallo,

    wie kann ich ein programm sofort abbrechen wenn ich nach einer datenprüfung merke das etwas nicht stimmt und das programm sofort beenden möchte ohne das es komplett zu ende läuft.

    es handelt sich dabei um eine opengl anwendung mit einer dauerschleife. es wird dabei eine klasse verwendet auf dessen daten ich mit get funktionen zugreife. aber wenn die daten nicht vorhanden sind möchte ich nicht das die anwendung weiterarbeitet oder irgendwelche default werte nimmt. die probleme die dadurch entstehen könnten wären nicht absehbar. deswegen soll die anwendung, sobald bemerkt wird das die daten nicht vorhanden bzw. nicht korrekt sind, abgebrochen werden ohne das der aktuelle schleifendurchlauf zuende geführt wird.


  • Mod

    exit(...);
    abort();
    FatalAppExit(...);
    ExitProcess(...);
    

    Evtl. eine eigene Funktion, die soviel wie möglich aufräumtund dann eine der obigen Funktionen aufruft.



  • Ich würde lieber werfen. Mach ein Exception-Typ, sowas wie notrecoverableException, den die Handler weiter nach oben werfen. Bei exit() usw, kann das noch eine Weile dauen, bis die Botschaften-Warteschlange abgearbeitet wurde.


  • Mod

    witte schrieb:

    Ich würde lieber werfen. Mach ein Exception-Typ, sowas wie notrecoverableException, den die Handler weiter nach oben werfen. Bei exit() usw, kann das noch eine Weile dauen, bis die Botschaften-Warteschlange abgearbeitet wurde.

    Verstehe ich nicht. Wenn exit aufgerufen wird ist sofort Schluß mit der Applikation, da dauert gar nichts, einzig die atexit Routinen werden aufgerufen...



  • danke

    also ich habe mich für exit() entschieden. das mit atexit ist auch interessant aber das muss ich mir später mal anschauen ob ich das gebrauchen kann. hatte erst noch terminate() probiert aber das scheint das selbe zu sein wie abort(), also von der dialogbox her gesehen.

    von dem sofortigen beenden der anwendung sollte der benutzer in der regel nicht betroffen sein. die klasse lädt die konfiguration ein aber ohne sie pauschal zu laden. ich als programmierer muss gezielt die werte laden die ich benutzen will. und wenn ich werte benutze ohne sie vorher geladen zu haben dann soll die anwendung sich beenden und ich bekomm meine mitteilung und weiss warum. wenn der benutzer an seiner konfiguration rumspielt werden die init funktionen der klasse hier schon eingreifen und die anwendung mit einer entsprechenden meldung 'sanft' beenden.



  • Es geht auch brutal mit: SendMessage(hwnd,WM_DESTROY,o,oL) an das
    Hauptfenster der Anwendung.


  • Mod

    berniebutt schrieb:

    Es geht auch brutal mit: SendMessage(hwnd,WM_DESTROY,o,oL) an das
    Hauptfenster der Anwendung.

    Dann kannst Du auch gleich TerminateProcess aufrufen...

    Ich hoffe niemand macht so was wirklich!



  • Und bitte berücksicgtige, dass bei den harten Methoden nicht immer eventuelle vorhandenen Referenzen auf DLLs wieder freigegeben werden. Aber es gibt eigentlich keinen Grund sein Programm or die wand zu fahren. Es gibt immer eine Möglichkeit es sabft zu beenden. Wenn nicht, hast du mit ziemlicher sichrheit einen Designfehler im Programm.



  • Auf die brutale Methode lassen sich auch fremde Programme abbrechen. Also warum nicht?



  • Siehe es mal so... Neo muss auch vorher eine Telefonzelle bevor man den Stecker
    ziehen kann. Zieht man Ihn einfach so können evtl. Gehirnschäden zurück bleiben 🙂



  • ja aber neo hatte auch nicht so einen mächtigen verbündeten wie das betriebssystem, das immer so gut wie alles aufräumt, was wir dreckig machen und einfach liegen lassen!!



  • Genau das wird dann aber nicht mehr garantiert und wie schon erwähnt ist
    das dann etwas schief geht oder Müll im Speicher bleibt so wie Handels nicht
    richtig gekickt werden mehr als nur Wahrscheinlich.

    Hält man sich nicht an die SLA's gibts keinen Schadensersatz! 🙂

    Den großen roten Knopf in einer Fertigungshalle drückst Du ja auch nur
    wenn dein Arme gerade in der 10t Presse hängt und nicht weil du eine rauchen
    gehen willst oder Feierabend hast.

    "Böse" Programme z.B. die sich auf Teufel komm raus gegen das schließen wehren
    sind so ziemlich der einzigste Einsatzort den ich mir gerade vorstellen kann.
    Wobei auch hier teils durch das "KILL" negative Komplikationen provoziert
    werden können.

    Ich hab einmal ein "kill -n PID" (war es -n?) auf einen MySQL Server angewand!
    Einmal... danach nie wieder. (UNIX Befehl für das sofortige terminieren eines Prozesses [hard kill])


  • Mod

    berniesbutt schrieb:

    ja aber neo hatte auch nicht so einen mächtigen verbündeten wie das betriebssystem, das immer so gut wie alles aufräumt, was wir dreckig machen und einfach liegen lassen!!

    Und Du irrst. Bestimme Handles oder gesperrte Semaphoren oder Mutexe werden durch TerminateProcess nicht freigegeben. Wenn Du glück hast, killst Du nicht nur NEO, sondern die ganze Matrix... 🕶



  • Der Fragesteller hat seine Frage beantwortet bekommen. Jede weitere Diskussion ist damit überflüssig! Klar, man kriegt ein Programm auch beendet, indem man den Netzstecker zieht oder mit dem Hammer den Bildschirm zertrümmert. Bitte Schluss jetzt!



  • berniebutt schrieb:

    Klar, man kriegt ein Programm auch beendet, indem man [...] mit dem Hammer den Bildschirm zertrümmert.

    _dies_ wage ich zu bezweifeln! 😛


Anmelden zum Antworten