#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 — это ад, поскольку нет надлежащих обучающих видеороликов о том, как программировать окно и как оно работает