cpx*_*cpx 1 winapi multithreading
什么时候需要在多线程应用程序中使用这种类型的修改消息循环?
DWORD nWaitCount;
HANDLE hWaitArray[4];
BOOL quit;
int exitCode;
while (!quit)
{
MSG msg;
int rc;
rc = MsgWaitForMultipleObjects(nWaitCount, hWaitArray, FALSE, INFINITE,QS_ALLINPUT);
if (rc == WAIT_OBJECT_O + nWaitCount)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
quit = TRUE;
exitCode = msg.wParam;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if (rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + nwaitCount)
{
int nlndex = rc - WAIT_OBJECT_0;
}
else if (rc >= WAIT_ABANDONED_0 && rc < WAIT_ABANDONED_0+ nWaitCount)
{
int nlndex = rc - WAIT_ABANDONED_O;
}
}
Run Code Online (Sandbox Code Playgroud)
希望永远不会.但是,当您希望UI线程阻止同步对象时,您必须编写这种代码.不允许阻止UI线程,Windows阻止您调用WaitForMultipleObjects().原因是它很可能导致死锁.
原因是COM.COM在Windows中无处不在,最常见的例子是剪贴板,拖放和shell对话框.COM通过使用消息循环对来自STA(单线程单元)上的COM对象的工作线程进行接口方法调用.如果STA线程没有泵送消息,则呼叫将不会完成.并且无法完成的调用是死锁的第一个成分.添加等待工作线程完成的UI线程,并确保死锁.
通过让工作线程使用PostMessage()向UI线程发出重要事件发生的信号来避免这种代码.
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |