Как реализовать «Выход Y, N» при нажатии кнопки закрытия

#c #multithreading #winapi

#c #многопоточность #winapi

Вопрос:

Я пытаюсь понять потоковую систему Windows, но недавно у меня возникла проблема, которую я не могу полностью понять:

Я хочу, чтобы моя консоль не закрывалась при нажатии кнопки закрытия, а скорее спрашивала вас, должна ли она закрываться или нет. Теперь все это выполняется в функции Thread (), которая просто проверяет, является ли глобальный static volatile bool bActive == false , если это поток, просто заканчивается. Но я бы ожидал, что он напишет какое-нибудь сообщение, и если его нет — продолжит работать нормально.

Я пробовал это:

 // in console creation function
SetConsoleCtrlHandler((PHANDLER_ROUTINE)CloseHandler, TRUE);
  

и

 static bool CloseHandler(DWORD event)
{
    if (event == CTRL_CLOSE_EVENT)
    {
printf("close event");
        if(bActive)
        { 
            InterlockedDecrement(amp;bActive);
            WaitForSingleObject(hThread, INFINITE); // just wait for thread to finish or restart
        }
    }
    return true;
}
  

но это закрывает приложение независимо от выбора, который оно может предложить.

вот остальной код:

 DWORD _stdcall VGameThread(void* _self)
{

    while (bActive)
    {
        while (bActive)
        {
// do its things
        }
        if (on())
            break;
        else
            InterlockedIncrement(amp;bActive);
    }
}
on()
{

    int i;
    scanf("%d", amp;i);
    if (i == 1)
        return 1;
    else
        return 0;
}
  

Комментарии:

1. Я хочу, чтобы моя консоль не закрывалась при нажатии кнопки закрытия, а скорее спрашивала вас, должна ли она закрываться или нет — нет опции. ваше консольное приложение в любом случае будет принудительно закрыто

2. и для чего это InterlockedIncrement , InterlockedDecrement ? не нужно писать какой-то код, не понимая, что он делает и смысла

3. Вот почему консольное приложение в основном является консольным приложением: оно не может отвечать на сообщения, подобные gui, такие как WM_CLOSE. Следовательно, вам нужно создать приложение с графическим интерфейсом и забыть о консоли, которая предназначена только для самого простого ввода-вывода и «переносимых» приложений командной строки.

4. @IlyaPakhmutov в чем смысл? Создайте стандартное окно с самого начала. Приложения консоли не имеют контроля над «окном» консоли, которое их содержит.

5. @MichaelChourdakis поскольку я не знаю как, я создал движок консольной игры, создание его снова в winapi — это ад, поскольку нет надлежащих обучающих видеороликов о том, как программировать окно и как оно работает