MsgWaitForMultipleObjects循环延迟函数和sleep的区别

明生注:由于在开发的程序在某个时间段是需要暂停的,此时我们所使用的最多的是SLEEP(X秒),但是一来你会发现界面会进入阻塞模式,如果你是长时间暂停,那么界面会进入无响应状态,这是你不愿意看到的.要嘛你就需要用一个定时器或者一个线程才能解决暂停的而不阻塞的问题.所以就需要采用另外几种方式…以下是网络提供的一些好思路的函数…但是提醒一句.当你在需要长时间暂停的时候,最好还是采用线程加SLEEP,因为像下列的函数是不断的在循环,会造成一定的内存和CPU的消耗   函数1:

procedure delay(msecs:integer);

var

  Tick: DWord; 

  Event: THandle; 

begin

  Event := CreateEvent(nil, False, False, nil); 

  try

    Tick := GetTickCount + DWord(msecs); 

    while (msecs > 0) and (MsgWaitForMultipleObjects(1, Event, False, msecs, QS_ALLINPUT) <> WAIT_TIMEOUT) do

    begin

      Application.ProcessMessages; 

      msecs := Tick - GetTickcount; 

    end; 

  finally

    CloseHandle(Event); 

end;

函数2:

procedure Delay(dwMilliseconds:DWORD);//Longint

var

iStart,iStop:DWORD;

begin

    iStart :=   GetTickCount;

    repeat

    iStop  :=   GetTickCount;

    Application.ProcessMessages;

    until (iStop  -  iStart) >= dwMilliseconds;

end;

 

此项目被张贴在未分类 。书签的 permalink

发表评论

电子邮件地址不会被公开。 必填项已用*标注