Sto scrivendo un'applicazione console in C++.Problema di routine SetConsoleCtrlHandler
Uso SetConsoleCtrlHandler per bloccare la chiusura e il tasto CTRL + C. Ciò consente a tutti i miei thread di fermarsi e uscire correttamente.
Uno dei thread esegue alcuni salvataggi che richiedono un po 'di tempo per il completamento e ho del codice da attendere nella routine di handle crtl della console. MSDN specifica che una finestra dovrebbe apparire dopo 5 secondi per CTRL_CLOSE_EVENT, ma invece il mio processo termina.
Questo è fastidioso per l'applicazione di debug della console anche quando il processo termina prima che tu possa passare e non so quale possa essere il problema (ho Windows 7 a 64 bit).
Inoltre, stranamente se la mia routine restituisce VERO (per disabilitare semplicemente l'azione di chiusura), chiude comunque l'applicazione. La routine viene chiamata, quindi SetConsoleCtrlHandler è stato installato correttamente.
es .:
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;
}
Tutte le idee?
Il tempo di 10 secondi è solo metà della verità. L'applicazione verrà chiusa una volta restituito il gestore, quindi è necessario mantenere in esecuzione il gestore. –
Si noti che il gestore viene eseguito nel contesto di un thread arbitrario (questa è la ragione per cui il programma continua a essere in esecuzione). Quindi è necessario utilizzare un meccanismo thread-safe per segnalare che la terminazione è in corso (ad esempio un evento). –
Se il gestore restituisce false e il gestore predefinito viene chiamato, il processo viene chiuso tramite 'ExitProcess (STATUS_CONTROL_C_EXIT)'. Se il processo esce da solo prima di tornare, può utilizzare un codice di uscita diverso per indicare un arresto riuscito. Altrimenti, se il gestore restituisce true o richiede più di 5 secondi (non 10 secondi), il processo viene terminato forzatamente dal server di sessione (csrss.exe) con il codice di uscita 'STATUS_CONTROL_C_EXIT'. – eryksun