Ok, j’écris un programme qui fait des parsings assez lourdes et je voudrais pouvoir l’arrêter rapidement.
J’ai ajouté un signal(SIGINT, terminate);
au début du principal et du défini se terminent comme:
void terminate(int param){ cout << endl << endl << "Exit [N]ow, or [A]fter this url?" <> answer; if(answer[0] == 'n' || answer[0] == 'N'){ terminateParser(); exit(1); }else if(answer[0] == 'a' || answer[0] == 'A'){ quitAfterUrl = true; } }
Sous Linux, cela a fonctionné comme je l’espérais, c’est-à-dire qu’il attendait une entrée utilisateur. Mais quand j’essaie de faire la même chose dans Windows, il affiche le message et quitte quand même.
Est-il possible d’empêcher SIGINT de fermer le programme immédiatement?
Mettre à jour:
quand j’ai essayé
BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; }
Comme Gregory l’a suggéré, le programme s’est encore arrêté sans cérémonie sans s’arrêter pour la saisie de l’utilisateur.
Mise à jour 2: Je ne suis pas tout à fait sûr de ce qu’il a fait, mais le code fonctionne maintenant. Merci à tous pour votre aide.
De MSDN:
Remarque SIGINT n’est pris en charge par aucune application Win32, y compris Windows 98 / Me et Windows NT / 2000 / XP. Lorsqu’une interruption CTRL + C se produit, les systèmes d’exploitation Win32 génèrent un nouveau thread pour gérer spécifiquement cette interruption. Cela peut entraîner le multithread d’une application à thread unique, telle qu’UNIX, ce qui entraîne un comportement inattendu.
Ce qui signifie que vous devrez utiliser la directive de prétraitement et implémenter une solution spécifique à Windows .
BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; }
Et au début du main
vous faites
SetConsoleCtrlHandler(handler, TRUE);