请教MsgWaitForMultipleObjects的用法

zzh54zzh 2006-10-09 11:57:41
MsgWaitForMultipleObjects的第四个参数是超时的设定时间,按常理说若超出了这个时间就会返回WAIT_TIMEOUT,但是我在还处理了其它的系统消息,即在WAIT_OBJECT_0 + ncount的时候进行了处理,也就是说以下的:
isTimeout := True;
while (dwEndTime > dwCurrentTime) do ————>而事实上超时是在这里判断的!
begin
waitResult := MsgWaitForMultipleObjects(8, HandlesToWaitFor, FALSE, timeoutSec, QS_ALLINPUT);

if waitResult in [WAIT_OBJECT_0 .. WAIT_OBJECT_0 + 7] then
begin
……处理我需要的
end
else if waitResult = WAIT_OBJECT_0 + 8 then
begin
……处理系统消息
PeekMessage(msg, 0, 0, 0, PM_REMOVE);
DispatchMessage(msg);

dwCurrentTime := GetTickCount;
end
else if waitResult = WAIT_TIMEOUT then
begin
//此时永远不会触发到!!!因为总会返回WAIT_OBJECT_0 + 8的系统消息
Result := -1;
exit;
end;
end;
if isTimeout then
Result := -1;

我总认为我写的代码有问题,若windows的这个api提供了超时的参数,就应该能在WAIT_TIMEOUT里处理,而不用另外的时间计算。

请高手指点!
...全文
1142 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
DoorKey 2007-04-20
  • 打赏
  • 举报
回复
“//此时永远不会触发到!!!因为总会返回WAIT_OBJECT_0 + 8的系统消息”

我们先看一下MsgWaitForMultipleObjects返回WAIT_TIMEOUT 的条件,见MSDN :
The time-out interval elapsed and the conditions specified by the bWaitAll and dwWakeMask parameters were not satisfied.

也就是说当超时,而此时如果线程里又有消息,即也满足 dwWakeMask 的条件时,
返回的是WAIT_OBJECT_0 + nCount。其实要想返回WAIT_TIMEOUT,调用
MsgWaitForMultipleObjects的时候bWaitAll参数要为False,而 dwWakeMask参数要为0。
SonicX 2006-10-11
  • 打赏
  • 举报
回复
改用case语句试试?
zzd8310 2006-10-10
  • 打赏
  • 举报
回复
再顶
zzd8310 2006-10-09
  • 打赏
  • 举报
回复
帮顶

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧