Какой C ++ эквивалентен MsgWaitForMultipleObjectsEx winapi? - PullRequest
0 голосов
/ 30 января 2019

Я делаю переход от использования собственных вызовов Win32 API для управления очередью сообщений моего потока к использованию моего собственного кода C ++.Я столкнулся с вопросом, на который я не могу полностью ответить.

Учитывая следующий фрагмент кода

LRESULT QueueConsumeThread()
{
    MSG msg = { 0 };

    HANDLE hHandles[] = { hHandle1, hHandle2 };
    while (true)
    {
        DWORD dwRes;
        switch (dwRes = ::MsgWaitForMultipleObjects(_countof(hHandles), hHandles, FALSE, INFINITE, QS_ALLEVENTS))
        {
            case WAIT_OBJECT_0 :
                DoSomething();
                break;
            case WAIT_OBJECT_0 + 1:
                DoSomething2();
                break;
            case WAIT_OBJECT_0 + _countof(hHandles):
                ATLASSERT(msg.message == WM_QUIT);
                return 1;
        }
    }

    return 1;
}

Я читал во многих источниках, что конкретный поток должен быть связан с однимcondition_variable, также то, что использование нескольких condition_variable s или вызов wait_for() или wait_until() не звучит слишком эффективно.

Следующий источник предложил реализовать safe_queue с использованиемcondition_variable s.Я предполагаю, что PeekMessage / GetMessage/MsgWaitForMultipleObject работают аналогично, но какие данные должны храниться в каждой ячейке очереди и иметь возможность принимать сигналы событий?

Редактировать : Яспрашивая это, поскольку я должен написать кроссплатформенное приложение.

1 Ответ

0 голосов
/ 30 января 2019

В отличие от событий синхронизации окон (которые могут находиться в состоянии signalled) std::condition_variable отделен от состояния.Таким образом, наиболее естественный подход состоит в том, чтобы определить несколько условий и ждать / сообщать о них с помощью единственного condition_variable:

std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{ return ready1 || ready2 || ready3; });
if (ready1) { ... }
if (ready2) { ... }
if (ready3) { ... }

std::unique_lock<std::mutex> lock(m);
ready1 = true;
cv.notify_one();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...