Я создаю тему для своей игры. Но я обнаружил, что если нажать кнопку «Закрыть» или задачу убивают, я не могу правильно завершить работу, освобождая все необходимые мне ресурсы внутри программы.
Я обнаружил, что обработчик Close существует, но приведенный пример является для меня неизвестной магией, потому что мне нужно создать нечто подобное в ANSI-C.
static BOOL CloseHandler(DWORD evt)
{
if (evt == CTRL_CLOSE_EVENT)
{
m_bAtomActive = false;
// Wait for thread to be exited
std::unique_lock<std::mutex> ul(m_muxGame);
m_cvGameFinished.wait(ul);
}
return true;
}
Я знаю, что в Winapi есть Mutex и условные переменные, но я ничего не знаю о std :: atomic эквивалент.
У меня есть функция запуска потока и функция внутри потока GameThread У меня есть обычная переменная bool m_bAtomActive, проверенная сейчас.
void Start(void* _self)
{
DWORD dwThreadID;
HANDLE hThread;
struct c_class* this = _self;
this->m_bAtomActive = true;
hThread = CreateThread(
NULL,
0,
&GameThread,
_self,
0,
&dwThreadID);
WaitForSingleObject(hThread, INFINITE);
}
Я плохо разбираюсь в потоках, что я должен сделать, чтобы правильно завершить работу моей игры?
Все дополнительные подробности будут предоставлены в комментариях или в чате.
UPD: Первое, что кажется простым, это можно решить с помощью этой строки внутри обработчика закрытия
if(Active)
InterlockedDecrement(&Active);
Но второе и третье все еще под вопросом. Они могут быть созданы по причине того, что CloseHandler убил приложение перед уничтожением, но я точно не знаю.