Я пытался найти хорошую архитектуру для одного приложения в течение последних нескольких дней, и после некоторых исследований я, наконец, застрял, и причина в COM.COM + WaitForSingleObject
В этом приложении будет несколько потоков графического интерфейса, и они будут планировать рабочие элементы для рабочего потока. Рабочий поток инициализирует COM через CoInitialize (NULL); создает несколько COM-компонентов и перейдет в цикл, который будет ждать WaitForMultipleObjects (2, ...) (ExitEvent - для указания того, что приложение закрывается, а ManualResetEvent - для указания что на самом деле есть рабочие элементы для обработки), и при успешном ожидании обрабатывают элементы и отправляют их обратно в потоки графического интерфейса. 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;
}
А как насчет скрытого окна, сообщений, я даже на правильном пути?
Переместить объекты COM из потока в поток? Или они живут в одной нити? Что делают объекты COM, в двух словах? Я думаю, что ваша архитектура далека от поля, потому что вы плохо знаете совет. –
У меня вопрос не возникает. В чем проблема? –
Также поясните «несколько потоков графического интерфейса». Вы просто ссылаетесь на скрытое окно COM, или вы действительно пытаетесь использовать несколько основных графических потоков? –