Windows Ctrl-C - Очистка объектов локального стека в приложении командной строки - PullRequest
0 голосов
/ 19 сентября 2011

Я пишу консольное приложение Windows, которое создает некоторые объекты в основном потоке и запускает их в цикл, выходя только тогда, когда пользователь использует прерывание Ctrl-C.

Теперь я прочитал немного о том, как написать правильный обработчик прерываний в статьях, подобных этой: http://msdn.microsoft.com/en-us/library/ms685049%28VS.85%29.aspx, но я все еще смущен одной вещью. Кажется, что обработчик прерываний оставляет ограниченную область для локальной очистки объекта. Например, если бы у меня был такой обработчик:

BOOL CtrlHandler ( DWORD fdwCtrlType )
  ... handle Ctrl-C 

и моя главная выглядела примерно так:

int main() {
      DBClient db;
      DataPuller p;

      while (true) {
           ... do stuff until Ctrl-C comes in
      }

Даже если я улавливаю Ctrl-C, кажется, что нет способа правильно очистить переменные db и p, не объявляя их глобальными, от чего я обычно держусь подальше.

Есть ли лучший способ сделать это, или я упускаю что-то очевидное? Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Вы создаете цикл для условной переменной.

Когда вы получаете ctrl-C (SIGINT), вы устанавливаете для условной переменной значение false и возвращаете.Цикл затем выйдет нормально.

bool finished = false;

int main()
{
      DBClient db;
      DataPuller p;

      while (!finished)
      {
           // ... do stuff until Ctrl-C comes in
      }
}

// Signal handler or Control handler on windows
// Set finished = true.
1 голос
/ 19 сентября 2011

Не думаю, что это можно сделать без хотя бы одного глобала. Тем не менее, я думаю, что вам нужен только один:

BOOL is_shutting_down = false;

BOOL CtrlHandler ( DWORD fdwCtrlType ) {
    switch( fdwCtrlType ) 
    { 
        // Handle the CTRL-C signal. 
        case CTRL_C_EVENT: 
            is_shutting_down = true;
            return( TRUE );
    }
}

int main() {
      DBClient db;
      DataPuller p;

      while (is_shutting_down == false) {
           ... do stuff until Ctrl-C comes in
      }

      //objects clean themselves automatically.
}

Побочным эффектом глобального "is_shutting_down" является то, что если для него установлено значение true, деструкторам не нужно освобождать память, так как операционная система автоматически все равно ее исправит, что позволяет вам выключать FAST, если у вас есть большое количество небольших выделений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...