取自网络
//延时函数,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)
本文探讨了如何在保持界面响应性的同时,优化等待函数的CPU占用率,通过对比`procedureDelay`和`procedureWaitTime`两种方法,并提出了一种改进的`procedureWaitTime`实现来有效降低CPU占用率。
&spm=1001.2101.3001.5002&articleId=42425377&d=1&t=3&u=6094b1d1abea4e5e84edc13150a67b41)
1万+

被折叠的 条评论
为什么被折叠?



