Я пытался найти хорошую архитектуру для одного приложения в течение последних нескольких дней, и после некоторого исследования я, наконец, застрял, и причина в COM.
У рассматриваемого приложения будетнесколько потоков GUI, и они будут планировать рабочие элементы для рабочего потока.Рабочий поток инициализирует COM с помощью CoInitialize (NULL); создаст несколько компонентов COM и перейдет в цикл, который будет ожидать WaitForMultipleObjects (2, ...) (ExitEvent - чтобы указать, что приложение закрывается, а ManualResetEvent - чтобы указатьчто есть действительно рабочие элементы для обработки), и при успешном ожидании обработает элементы и отправит их обратно в потоки GUI.ManualResetEvent будет сброшено внутри работника, если очередь будет пустой и произойдет в критической секции очереди.
Проблема в том, что COM, как обычно, делает ВСЕ 1000x сложнее ...
ЕслиЯ правильно понимаю, CoInitialize (NULL);создает скрытое окно, и любое сообщение, опубликованное во время WaitForSingle / MultipleObject / s, может вызвать взаимоблокировку.
Итак, мне нужно вызвать объекты MsgWaitForMultiple.Который, в свою очередь, может потерпеть неудачу, если сообщения не передаются правильно.К сожалению, я не совсем понимаю, как правильно их прокачать.Должен ли я создать свой собственный цикл сообщений?Сбоит ли приложение, если COM решит создать окно сообщения?
До сих пор кажется, что я должен действовать следующим образом?
HANDLE hEvents[2] = {};
int ThreadProc(LPVOID lpParam) {
int nRetVal = 0;
CoInitialize(NULL);
CComPtr<ISomething> smthn;
smthn.CoCreateInstance(...);
MSG msg = {};
bool bRun = true;
while(bRun) {
while(PeekMessage(&msg, ??NULL/-1??, 0, 0, PM_REMOVE)) { /*Which one here?*/
if(msg.Message == WM_QUIT) {
bRun = false;
nRetVal = msg.wParam;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(MsgWaitForMultipleObjects(2, &hEvents, ...)) {
if(exitevent) { bRun = false; nRetVal = 0; }
else if(processevent) { [processdata] }
}
}
smthn.release();
CoUninitialize();
return nRetVal;
}
Но как насчет скрытого окна, ящиков сообщений, я даже направильный путь?