最近在做个ActiveX项目中碰到的问题,程序其他处理需要多线程处理,简单的说类似进度UI窗体同时显示,
开始ActiveX的接口做城了异步的,也就是调用接口没有等待完成就返回了,后来由于需要要求做成同步的,
就简单使用WaitForMultipleObjects了,但发现调用等待函数之后,画面不能正常显示,即使显示出来了,
也不能响应任何操作,后来改进的能响应的代码又把CPU有时搞成100%了,最终有个大哥帮我再改进后,等待期间占用CPU
很小了,觉得值得留念,顺便把代码纪录一下赫赫。
HANDLE p_handle[N] = {0};
// p_handle 说组复制
int HandleCount = sizeof(p_handle)/sizeof(p_handle[0]);
while (TRUE)
{
const DWORD Ret = MsgWaitForMultipleObjects(HandleCount, p_handle, FALSE, INFINITE, QS_ALLINPUT);
if ( WAIT_OBJECT_0 <= Ret && Ret <= ( WAIT_OBJECT_0 + HandleCount - 1 ) ){
CloseHandle( p_handle[Ret] );
--HandleCount;
if ( !HandleCount )
break;
if ( HandleCount - Ret ) {
memmove( &p_handle[Ret], &p_handle[Ret+1] , sizeof(HANDLE) * ( HandleCount - Ret ) );
}
}else if ( ( WAIT_OBJECT_0 + HandleCount ) == Ret ){
MSG msg = {0};
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else{
break;
}
}
有碰到类似问题的,如果参考上面代码有多大改进,反馈给俺一下如何赫赫,多谢。
期待有更好的改进方法。