2010-01-09 3 views
3

Хорошо, я пишу программу, которая проводит довольно тяжелый анализ, и я хотел бы иметь возможность быстро ее остановить.C++: Продолжить выполнение после SIGINT

Я добавил signal(SIGINT, terminate); к началу основного и определяется как прекратить:

void terminate(int param){ 
    cout << endl << endl << "Exit [N]ow, or [A]fter this url?" << endl; 
    std::string answer; 
    cin >> answer; 
    if(answer[0] == 'n' || answer[0] == 'N'){ 
     terminateParser(); 
     exit(1); 
    }else if(answer[0] == 'a' || answer[0] == 'A'){ 
     quitAfterUrl = true; 
    } 
} 

В Linux это работало как я ожидал, что это, то есть ждали пользовательского ввода. Но когда я пытаюсь сделать то же самое в окнах, он все равно показывает сообщение и выходит.

Есть ли способ остановить SIGINT сразу после закрытия программы?

Update:

, когда я попытался

BOOL WINAPI handler(DWORD dwCtrlType) 
{ 
    if (CTRL_C_EVENT == dwCtrlType) 
    { 
    // ask the user 
    } 
    return FALSE; 
} 

, как предложил Грегори, программа все еще бесцеремонно возбужденное без остановки для ввода данных пользователем.

Обновление 2: Я не совсем уверен, что это сделал, но код работает сейчас. Спасибо всем за помощь.

+0

Не точно решить ваш вопрос, - но если вы можете (и потому, что вы написали для Linux изначально), вы можете попробовать скомпилировать с помощью GCC на окнах - видимое поведение может напоминать Linux ближе. См. Веб-сайт MinGw. Также - cygwin привносит программирование еще ближе к unix, чем к mingw. – laura

+0

Я делаю это. – zmbush

+0

Вы вызывали 'SetConsoleCtrlHandler (обработчик, TRUE);'? в начале 'main'? –

ответ

8

From MSDN:

Примечание SIGINT не поддерживается для любого приложения Win32, включая Windows 98/Me и Windows NT/2000/XP. Когда происходит прерывание CTRL + C, операционные системы Win32 генерируют новый поток, который специально обрабатывает это прерывание. Это может привести к тому, что однопотоковое приложение, такое как UNIX, станет многопоточным, что приведет к неожиданному поведению.

Это означает, что вам необходимо будет использовать предпроцессорную директиву и реализовать Windows specific solution.

BOOL WINAPI handler(DWORD dwCtrlType) 
{ 
    if (CTRL_C_EVENT == dwCtrlType) 
    { 
    // ask the user 
    } 
    return FALSE; 
} 

И в начале main вы

SetConsoleCtrlHandler(handler, TRUE); 
+0

В качестве примечания: его ситуация позволяет, компиляция с gcc для окон может помешать перезаписи решения. – laura

+0

Я боялся этого. – zmbush

+0

@laura - Я уже использую gcc – zmbush

 Смежные вопросы

  • Нет связанных вопросов^_^