Escribo una aplicación de consola en C++.Problema de rutina SetConsoleCtrlHandler
Uso SetConsoleCtrlHandler para capturar cerca y CTRL + botón C. Esto permite que todos mis hilos se detengan y salgan correctamente.
Uno de los subprocesos realiza algunos ahorros que requieren algo de tiempo para completarse y tengo un código para esperar en la rutina de manejo de consola crtl. MSDN especifica que debe aparecer un cuadro después de 5 segundos para CTRL_CLOSE_EVENT, pero en su lugar mi proceso se cierra.
Esto también es molesto para la aplicación de la consola de depuración, ya que el proceso finaliza antes de que pueda pasar y no sé cuál puede ser el problema (tengo Windows 64bits).
Además, extrañamente si mi rutina devuelve TRUE (simplemente deshabilita la acción de cerrar), todavía cierra la aplicación. La rutina se llama, por lo que SetConsoleCtrlHandler se instaló correctamente.
ej .:
BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType)
{
if (dwCtrlType == CTRL_CLOSE_EVENT)
{
return TRUE;
}
return FALSE;
}
int _tmain(int argc, _TCHAR* argv[])
{
BOOL ret = SetConsoleCtrlHandler(ConsoleHandlerRoutine, TRUE);
while (true)
{
Sleep(1000);
}
return 0;
}
¿Alguna idea?
10 segundos de tiempo es solo la mitad de la verdad. La aplicación finalizará una vez que el controlador regrese, por lo que debe mantener el controlador en funcionamiento. –
Tenga en cuenta que el controlador se ejecuta en el contexto de un hilo arbitrario (esa es la razón por la cual el programa continúa ejecutándose). Por lo tanto, debe usar algún mecanismo seguro para señalar que la terminación está en progreso (por ejemplo, un evento). –
Si el controlador devuelve falso y se llama al controlador predeterminado, el proceso sale por 'ExitProcess (STATUS_CONTROL_C_EXIT)'. Si el proceso sale solo antes de regresar, puede usar un código de salida diferente para indicar un cierre exitoso. De lo contrario, si el controlador devuelve verdadero o tarda más de 5 segundos (no 10 segundos), el servidor de sesión (csrss.exe) finaliza con fuerza el proceso con el código de salida 'STATUS_CONTROL_C_EXIT'. – eryksun