in LOG schreiben bevor konsolen programm durch benutzer geschlossen wird....
-
oder wie kann ich denn in die textdatei schreiben? einfach mit in die switch case anweisung?
äh.
ja? jain (siehe unten).du kannst auch eine unterfunktion machen die das logfile aufmacht und was reinschreibt.
die unterfunktion rufst du dann "im switch case" einfach auf.der "ConsoleHandler" ist ne ganz normale funktion, nur dass sie asynchron (soweit ich mich erinnere in einem eigenen thread) aufgerufen wird wenn der user ctrl+C drückt bzw das fenster über das "X" zumachen will.
d.h. du musst sicherstellen dass sich der haupt-thread und der thread in dem der "ConsoleHandler" ausgeführt wird nicht in die quere kommen.p.S.: ja, stimmt:
http://msdn.microsoft.com/en-us/library/ms683242(v=VS.85).aspxAn application-defined function used with the SetConsoleCtrlHandler function. A console process uses this function to handle control signals received by the process. When the signal is received, the system creates a new thread in the process to execute the function.
-
Man sollte übrigens noch erwähnen, dass man damit nicht alle Möglichkeiten abfangen kann, ein Programm zu beenden. Windows XP kennt auch Methoden um einen Prozess ohne vorherige Ankündigung direkt zu beenden und einen Stromausfall kann man so natürlich auch nicht abfangen[*].
[*]: Außer im Falle einer Notstromversorgung
.
-
Dieser Thread wurde von Moderator/in pumuckl 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.
-
d.h. du musst sicherstellen dass sich der haupt-thread und der thread in dem der "ConsoleHandler" ausgeführt wird nicht in die quere kommen.
meine kenntnisse übersteigt das "wie ich sicherstelle.."

Windows XP kennt auch Methoden um einen Prozess ohne vorherige Ankündigung direkt zu beende
damit wäre der taskmanager und "prozess beenden" gemeint ?
ne notstromversorgung habe wir glaub ich..wahrscheinlich bleibe ich aber schlicht dabei das ich einfach nur in die log schreibe wenn das programm gestartet wird. wenns zweimal hintereinander gestartet wird ist ja sowieso klar das es vorher beendet wurde...
es sei denn ich bekomme raus wie ich sicherstelle das hauptthread und consolehandler sich nicht in die quere kommen... was würde denn passieren wenn sie es täten?
-
#include <cstdlib> void AusUndVorbei() { printf("Bye Bye !"); } int main() { atexit(AusUndVorbei); }
-
wieso nicht gleich so einfach? oder gibts nen haken dabei??
blöd ist nur ich darf der funktion keinen wert übergeben...
und das doppelte ofstream sieht auch blöd aus lässt sich aber wohl nicht vermeiden...ich könnte ja auch ein "atexit(logfile.put("blabla"))" setzten.. aber das lässt er auch nicht zu
void bla() { std::ofstream logfile("LOG.txt", std::ios_base::app); logfile << time_now() << " " << "Statwriter stopped." << std::endl; } int main() { char version[25] = "StatWriter v1.5"; SetConsoleTitleA(version); std::ofstream logfile("LOG.txt", std::ios_base::app); logfile << "\n" << time_now() << " " << version << " started." << std::endl; atexit(bla);
-
#include <cstdlib> static char* version = "StatWriter v1.5"; void AusUndVorbei() { printf("%s" version); } int main() { atexit(AusUndVorbei); }Und so?

-
hab mein beitrag editiert...
reicht wenn da steht statwriter.. die version ist da egal

so passt das... danke euch allen

ich frag mich aber trotzdem .. was der unterschied zu atexit und dem bsp von ..... ist
-
Mit einem Konsolenprogramm geht das nicht in jedem Fall oder nur bedingt. Bei einer Windows-Anwendung machst du unter WM_DESTROY noch eine LOG-Eintragung 'Programm verabschiedet sich!'
-
wie nicht in jedem fall oder nur bedingt?
also so funktioniert das recht gut.. bisher hatte ich da auch keine feherlemdlungen o.ä. ...
natürlich schreibt er nicht in die log wenn ich den prozess kille... aber das kommt, sollte ja eh nicht vorkommen
-
Die Funktion aus signal.h müsste diesen Job doch auch erfüllen.