Ich baue das folgende Programm in VS2017/Windows 10. Wenn ich es laufen lasse, klicke ich nah und ctrl_handler()
wird wie erwartet aufgerufen, aber nach ~ drei Sekunden wird der Prozess sowieso gewaltsam beendet.Warum wird der Ereignishandler für die Windows-Konsole geschlossen?
Dies ist ein Problem, weil meine reale Anwendung große Protokolldateien schreibt und drei Sekunden nicht lang genug sind, um sie auf die Festplatte zu bekommen.
Wo ist die Dokumentation, die dieses Verhalten beschreibt? Es ist nicht in those for the CTRL+CLOSE signal.
Wo wird die Zeitüberschreitung festgelegt? Kann es auf Anwendungsebene geändert werden? Oder mit einer Gruppenrichtlinie?
#include <Windows.h>
bool mainThreadRunning;
bool mainThreadFinished;
BOOL ctrl_handler(DWORD event)
{
if (event == CTRL_CLOSE_EVENT) {
mainThreadRunning = false;
while (!mainThreadFinished) {
Sleep(100);
}
return TRUE;
}
return FALSE;
}
int main()
{
mainThreadRunning = true;
mainThreadFinished = false;
SetConsoleCtrlHandler((PHANDLER_ROUTINE)(ctrl_handler), TRUE); // make sure when the user hits the close button in the console we shut down cleanly
while (true)
{
}
return 0;
}
Zum Senden eines Steuerelementereignisses fordert der Konsolenhost (conhost.exe) den Sitzungsserver (csrss.exe) zum Erstellen eines Steuerelementthreads im Client an. Dieser Thread beginnt bei 'kernelbase! CtrlRoutine' und ruft die registrierten Handler auf, bis entweder ein Handler' TRUE' zurückgibt oder der Default-Handler ('kernelbase! DefaultHandler') aufgerufen wird, der' ExitProcess (STATUS_CONTROL_C_EXIT) 'aufruft. Vista und höher erlauben es einem Handler nicht, den Prozess (und die Konsole) am Leben zu halten, indem für das Close-Ereignis "true" zurückgegeben wird. Stattdessen wartet der Sitzungsserver 5 Sekunden und beendet den Prozess, wenn er nicht beendet wurde. – eryksun