Poignée CTRL+C sur Win32

J'ai quelques problèmes avec le traitement de CTRL+C événements, dans un Win32 en C++ programme de console.

Fondamentalement, mon programme ressemble à ceci: (basé sur cette autre question: Windows Ctrl-C - Nettoyage des locaux de la pile des objets dans l'application en ligne de commande)

bool running;

int main() {

    running = true;
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) consoleHandler, TRUE);

    while (running) {
       //do work
       ...
    }

    //do cleanup
    ...

    return 0;
}

bool consoleHandler(int signal) {

    if (signal == CTRL_C_EVENT) {

        running = false;
    }
    return true;
}

Le problème est le nettoyage de code qui n'est pas exécutée du tout.

Après l'exécution de la fonction de gestionnaire le processus est terminé, mais sans exécuter le code après la boucle principale. Quel est le problème?

EDIT: comme l'a demandé, c'est un test minimal cas semblable à celui de mon programme: http://pastebin.com/6rLK6BU2

Je ne comprends pas le "test de nettoyage-instruction" chaîne dans ma sortie.

Je ne sais pas si c'est important, je suis de la compilation avec MinGW.


EDIT 2: Le problème avec les cas de test du programme est l'utilisation de la Sleep() fonction. Sans elle, le programme fonctionne comme prévu.

Dans Win32, le gestionnaire d'une fonction s'exécute dans un autre thread, donc lorsque le gestionnaire/thread se termine son exécution, le thread principal est de dormir. C'est probablement la cause de l'interruption du process?

Ce n' SetConsoleCtrlHandler retour?
Êtes-vous sûr que le ConsoleHandler fonction s'exécute à tous? Si vous exécutez le programme dans le débogueur et définir un point d'arrêt, l'arrêt au point d'arrêt?
Aussi, vous devez utiliser le type BOOL pour la retval, et DWORD pour l'argument de consoleHandler. Aussi, FAUX/VRAI à l'intérieur...
Et vous déclarer une fonction prototype de la consoleHandler fonction avant d'appeler SetConsoleCtrlHandler?
Alors comment voulez-vous vérifier que le code après la boucle ne veut pas s'exécuter? Si vous définissez un point d'arrêt à ce code et l'exécuter dans un débogueur, il va s'arrêter là?

OriginalL'auteur eang | 2013-08-17