gpt4 book ai didi

c++ - COM + WaitForSingleObject

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:55 25 4
gpt4 key购买 nike

过去几天我一直在尝试为一个应用程序寻找一个好的架构,经过一些研究我终于卡住了,原因是 COM。

有问题的应用程序将有多个 GUI 线程,它们将为工作线程安排工作项。工作线程将通过 CoInitialize(NULL); 初始化 COM,创建一些 COM 组件,然后进入循环等待 WaitForMultipleObjects(2, ...)(ExitEvent - 表示应用程序正在关闭,ManualResetEvent - 表示实际上有工作项要处理),并且在成功等待时,将处理这些项目并将它们 PostMessage 返回到 GUI 线程。如果队列为空,ManualResetEvent 将在 worker 内部重置,并将发生在队列临界区内。

问题是 COM 和往常一样,让一切都变得困难 1000 倍......

如果我没理解错,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;
}

但是对于隐藏窗口、消息框,我是否走在正确的道路上?

最佳答案

只需使用 CoWaitForMultipleHandles它将在隐藏的 COM 窗口上进行必要的消息泵送以进行线程间同步。

隐藏窗口属于 OleMainThreadWndClass 类,标题为 OleMainThreadWndName,但在 win9x 上,它的类是 WIN95 RPC Wmsg。它是隐藏的,这意味着您不能直接使用 EnumThreadWindows 来找到它。

关于c++ - COM + WaitForSingleObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3814425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com