Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Kontrolliertes Beenden eines C/C++ Prg. bei Systemende...

Mdl / 7 Antworten / Baumansicht Nickles

Wie kann ein Konsolenprogramm, d.h. dessen Source-Code in C/C++ kontrolliert beendet werden, wenn der User z.B. das Fenster schließen will, d.h. auf [x] oben rechts im Fensterrahmen klickt oder Windows herunterfährt?

Ich habe in mein Prg. zwar eine entspr. Reaktion auf CTRL-C einbauen können, aber das scheint mit für obiges nicht auszureichen.

Wenn ich jezt das System herunterfahre, muss ich das Prg. sozusagen immer abschießen... Nicht gerade schön...

Vielen Dank für evtl. Tipps...

Mdl

bei Antwort benachrichtigen
PaoloP Mdl „Kontrolliertes Beenden eines C/C++ Prg. bei Systemende...“
Optionen

welches bs ???

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Mdl PaoloP „welches bs ??? “
Optionen

Sorry für das Nicht-Erwähnen...

Windows (aktuell XP)

bei Antwort benachrichtigen
PaoloP Mdl „Sorry für das Nicht-Erwähnen... Windows aktuell XP “
Optionen

hmmm, ich überleg gerade ob ein subclassing auf das konsolenfenster möglich ist.
du bräuchtest das handle des konsolenfensters.
welche c++ version verwendest du ?

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Mdl PaoloP „hmmm, ich überleg gerade ob ein subclassing auf das konsolenfenster möglich...“
Optionen

Dafür benutze ich den C++Builder 6. Es muss nämlich auch unter früheren Windows-Versionen laufen...

Wenn Du aber eine Idee für VC++ hast, ist die vielleicht anwendbar...

Ein Handle auf das eigene Window zu ermittlen, dürfte eigentlich machbar sein. Mein Prg. ist ein Konsolenprogramm, aber kein reines DOS-Programm, d.h. ich kann die WindowsAPI auch nutzen.

Vielleicht kurz zur Erläuterung: Das Prg. rechnet ein paar Sekunden, dann wartet es ein paar Minuten (Sleep()) und das permanent.

Bei dem kontrollierten CTRL-C Abbruch habe ich die Funktion
signal(SIGINT, ctrlc_handling);
verwendet, die dafür sorgt, dass
die Fkt. ctrlc_handling()
automatisch angesprungen wird, sobald CTRL-C (oder ähnliches) passiert. Diese setzt dann die globale Variable DoAbort auf true. An geeigneten Stellen wird diese überprüft und, falls true, das Programm sauber beendet.

Nunja, beim Klick auf [x] oder beim Herunterfahren wird diese jedenfalls nicht angesprungen.

Grüße,

Mdl


P.S.

Aber - beim Nachschauen gerade - ist mir die Idee gekommen, mal zu prüfen, ob das vielleicht bei einem Wert ungleich SiGINT funktioniert. Ich teste das am besten gleichmal....

bei Antwort benachrichtigen
Mdl Nachtrag zu: „Dafür benutze ich den C Builder 6. Es muss nämlich auch unter früheren...“
Optionen

> Aber - beim Nachschauen gerade - ist mir die Idee gekommen, mal zu prüfen, ob das vielleicht bei einem Wert ungleich SIGINT funktioniert. Ich teste das am besten gleichmal....

Hat auch prima geklappt (mit SIG_BREAK):

Der Funktionsaufruf
signal(SIG_BREAK, signal_handling_fct);

definiert signal_handling_fct() als Funktion, die ausgeführt wird, wenn ein entsprechendes Signal ankommt. Bei mir deklariert als
void signal_handling(int sig);
Es hat sich gezeigt, dass sowohl der Klick auf das [x]-Symbol zum Schließen des Fensters, als auch das Herunterfahren das Systems ein solches Signal an das Programm übermittelt.

In meinem Prg. setzte ich innerhalb von signal_handling_fct() also die globale Variable DoAbort=true (s.o.).

Damit habe ich jetzt das Gewünschte erreicht: Kein Blockieren mehr beim Herunterfahren des Systems...

Viele Grüße,

Mdl




bei Antwort benachrichtigen
Synthetic_codes Mdl „Kontrolliertes Beenden eines C/C++ Prg. bei Systemende...“
Optionen

Hi Mdl, für diesen Fall sieht C die funktion atexit(void *) vor.

Die Funktion atexit nimmt einen Pointer auf eine Funktion auf, die beim beenden des Programms ausgeführt wird. Auch wenn das Programm nicht regulär beendet wird, wird diese Funktion noch ausgeführt.

beispiel aus der ncurses programmierung (ich lasse < und > jetzt mal bei dne includes weg):

#include stdio.h
#include stdlib.h
#include ncurses.h

void quit(void)
{
//hier kommt dann das zeug zum ordentlichen beenden rein, in unserem fall wollen wir ncurses
//deinitialisieren
endwin();
}

int main(int argc, char **argv)
{
atexit(quit)
initscr();
refresh();
return 0;
}

wie du siehst wird beim start ein exit handler eingerichtet, die funktion quit soll beim beenden des programms ausgeführt werden. Wenn du das system herunterfährst, wird das programm auch beendet, und die funktion wird ausgeführt.
Dieses beispiel funktioniert unter windows und linux. Beachte dass ich zwar C verwendet habe, C jedoch eine teilmenge von C++ ist und dieses Beispiel also auch unter C++ funktionieren wird.

nähere informationen zu atexit wirst du hier finden:
http://openbook.galileocomputing.de/c_von_a_bis_z/c_022_003.htm#Xxx999331

'); DROP TABLE users;--
bei Antwort benachrichtigen
Mdl Synthetic_codes „Hi Mdl, für diesen Fall sieht C die funktion atexit void vor. Die Funktion...“
Optionen

Cool,

die Fkt. kannte ich noch nicht...


Danke für die Info,

Mdl

bei Antwort benachrichtigen