等待函数(保持界面正常响应)

来源:互联网 发布:java this关键字详解 编辑:程序博客网 时间:2024/06/06 20:02

取自网络


//延时函数,msec 为毫秒

procedure Delay(msec: single);
var
  FirstTickCount: real;
begin
  if msec > 0 then
  begin
    FirstTickCount := GetTickCount();
    FirstTickCount := FirstTickCount + msec;
    while FirstTickCount > GetTickCount() do
      Application.HandleMessage; //关键在这里
  end;
end;


// 测试CPU占用率<1% (CPU i3)


// 等待函数(保持界面正常响应) MSecs为毫秒
procedure WaitTime(MSecs: Integer);
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := Windows.GetTickCount();
  repeat
    Now := Windows.GetTickCount();
    Application.ProcessMessages;
  until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;

// 测试CPU占用率10% -- 25%  (CPU i3)


// *通过测试,在线程中调用Delay函数,存在线程函数执行中断(不在有任何响应,但主程序仍正常执行)的情况,而调用WaitTime则正常

// 为降低CPU占用率将WaitTime函数代码修改如下:

// 等待函数(保持界面正常响应) MSecs为毫秒
procedure WaitTime(MSecs: Integer);
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := Winapi.Windows.GetTickCount();
  repeat
    Sleep(1);  // 避免CPU占用率高
    Application.ProcessMessages;
    Now := Winapi.Windows.GetTickCount();
  until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;

// 测试CPU占用率 < 1%  (CPU i3)


0 0
原创粉丝点击