Как использовать близкий обработчик в winapi, если вам нужно очистить все в другом потоке? - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю тему для своей игры. Но я обнаружил, что если нажать кнопку «Закрыть» или задачу убивают, я не могу правильно завершить работу, освобождая все необходимые мне ресурсы внутри программы.

Я обнаружил, что обработчик 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 убил приложение перед уничтожением, но я точно не знаю.

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