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

解决方案 »

  1.   

    “//此时永远不会触发到!!!因为总会返回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。