Я делаю переход от использования собственных вызовов 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
работают аналогично, но какие данные должны храниться в каждой ячейке очереди и иметь возможность принимать сигналы событий?
Редактировать : Яспрашивая это, поскольку я должен написать кроссплатформенное приложение.