Как передавать сообщения Windows из одного потока в другой? - PullRequest
0 голосов
/ 26 апреля 2019

Я пишу движок для консольных игр. Игровой цикл в нем обрабатывается отдельной функцией потока:

hThread = CreateThread(
        NULL,
        0,
        &_GameThread,
        _self,
        0,
        &dwThreadID);

WaitForSingleObject(hThread, INFINITE);

_GameThread() сам пока содержит просто while(1). Довольно просто.

Мне нужно каким-то образом управлять элементами управления в игре, поэтому я выбрал подход к созданию окна сообщения, которое переводит кнопки, нажатые в некоторый массив, который затем обрабатывается функциями в потоке для какого-либо действия (движение, поворот и т. Д.) , Также сделана функция, которая передает сообщение в скрытое окно:

int _DispMessage()
{
    MSG msg;
    int gResult;
    if(gResult = GetMessageW(&msg, 0, 0, 0) > 0) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return gResult;
}

Без потока эта функция работает нормально, но когда выходит игровой цикл, изнутри не поступает никаких сообщений, кроме сообщений о создании. Итак, вопрос в том, как сделать сообщения асинхронными, чтобы я мог помещать коды клавиш в очередь, а затем извлекать их в игровом цикле?

У меня есть только основной процесс, который выполняет движок и один поток.

1 Ответ

0 голосов
/ 26 апреля 2019

Это классическая проблема производителя-потребителя .Вы можете найти его в Интернете для примеров реализации.

Основная идея заключается в том, чтобы иметь массив разделяемой памяти между основным потоком и потоком, который будет использовать ваш код ключа.

Когда основнойПоток доступа к массиву (то есть, когда вы читаете код ключа), вы блокируете массив, используя мьютекс или семафор.Когда ключ добавлен в массив, блокировка снята.

В потоке-получателе, прежде чем пытаться получить доступ к массиву, вы ждете разблокировки семафора / мьютекса, блокируете его, потребляетеключ от него, а затем снимите блокировку.

Обратите внимание, что это решение в его нынешнем виде будет медленнее (с точки зрения производительности), чем управление ключами из основного потока.Когда вы блокируете поток, он по существу перестает работать, пока вы не разблокируете его.Так что, если ваш потребительский поток не выполняет работу отдельно от ожидания основного потока, затраты на блокировку / разблокировку, переключение контекстов и т. Д. Будут увеличивать накладные расходы на программу.

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