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里处理,而不用另外的时间计算。请高手指点!
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里处理,而不用另外的时间计算。请高手指点!
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。