C ++: Как я могу проверить, закрывается ли мое окно? - PullRequest
2 голосов
/ 21 февраля 2012

Я пытаюсь создать консольную ASCII-игру для Win32 / * nix.Я не хочу использовать никаких библиотек, которые не являются стандартными C ++ или * nix / windows (.h).

Я хочу, чтобы это было структурировано как игровой цикл.Ака:

while (!WIN_CLOSE_FUNCTION()) {
  //Do crap
}
//Do other shutdown crap
return 0;

Может кто-нибудь указать мне, что это будет за функция?Если это зависит от платформы, приведите один пример для Windows и * nix.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Для консоли Unix / Linux такой функции нет. Самое близкое, что вы можете сделать, это поймать сигнал SIGHUP, который посылается при потере терминала. Однако имейте в виду, что то, что вы можете сделать в обработчике сигналов, весьма ограничено. Вероятно, ближайший к вашему циклу будет (примечание: непроверенный код):

#include <signal.h>

volatile sig_atomic_t hupflag = 0;

extern "C" void hangup(int)
{
  hupflag = 1;
}

int main()
{
  sigaction act;
  act.sa_handler = hangup;
  act.sa_mask = 0;
  act.sa_flags = 0;
  if (sigaction(SIGHUP, &act, 0) < 0)
  {
    std::cerr << "could not install signal handler\n";
    return 1;
  }

  while (!hupflag)
  {
    // ...
  }
  // shutdown
  return 0;
}
2 голосов
/ 21 февраля 2012

Подобный вопрос, который может вам помочь Что происходит при закрытии консольного приложения c ++

Принятый ответ: закрытие консольного приложения c ++ с символом "x" в верхнем углуCTRL_CLOSE_EVENT, который можно перехватить и обработать, если вы установите обработчик элемента управления с помощью функции SetConsoleCtrlHandler.

Полезные ссылки:

On * nix:

В Linux и других системах Unix консоль запускается как отдельный процесс.Когда вы закрываете оболочку, она отправляет сигнал SIGHUP текущему активному процессу или процессам, которые не выполняются в фоновом режиме.Если программист не справляется с этим, процесс просто завершается.Тот же сигнал посылается, если вы закрываете сеанс SSH с терминалом и активным процессом.

ответ, предоставленный @Zyx на вопрос, связанный выше

1 голос
/ 06 января 2015

По сути, такой функции нет, но Unix и Windows будут отправлять сигнал (SIGHUP под Unix, SIGBREAK под Windows) всем процессы в группе процессов, когда окно, в котором процесс группа зависит закрыто. Так что все, что вам нужно сделать, это поймать сигнал и установить флаг, который вы тестируете в цикле:

#ifdef _WIN32
int const sigClosed = SIGBREAK;
#else
int const sigClosed = SIGHUP;
#endif

volatile sig_atomic_t windowClosed = 0;

void signalHandler( int )
{
    windowClosed = 1;
}

//  ...
signal( sigClosed, signalHandler );
while ( windowClosed == 0 ) {
    //  ...
}

Если вы делаете какой-либо ввод с консоли в цикле, вы получите будьте готовы к тому, что ввод потерпит неудачу (каким вы должны быть в любом случае).

...