可能你不知道的 CPU 资源杀手

原创 2004年09月10日 01:01:00
问题的提出:

如果你没有用过 TAction,或许你不该说你会 DelphiTAction 大大简化了界面逻辑的关联,加速了项目的开发。不过我在程序中大量使用 TAction 时,无意发现这样一个问题:如果程序的某个窗体里有超过100TAction,在运行这个程序时,只要不停的在该窗体上快速移动鼠标,CPU 占用率会猛增到 30% 左右。

 

为什么会有如此高的 CPU 占用?

使用 Spy++ 调试后发现,一旦鼠标快速在窗体上移动,程序会频繁发送 WM_UPDATE 消息。进一步调试后发现,TContainedAction.Update() TActionManager 频繁调用。正如帮助文档中所写:当应用程序处于空闲状态时,所有的 TxxxxAction.OnUpdate 事件会被触发。由于空闲状态频繁改变,因此 OnUpdate 也就被频繁触发,这个正是造成不当 CPU 占用的真正原因。

 
解决方案

如果你的程序中没有使用到 TxxxxAction.OnUpdate,那么你可以屏蔽 TActionManager 去查询并触发 TxxxxAction.OnUpdate。具体实现代码如下:

uses
 FastcodePatch
{http://fastcode.sourceforge.net/};

procedure TContainedActionUpdateStub;
asm
 call TContainedAction.Update;
end;

type
 TContainedActionPatch =
class(TContainedAction)
 
public
   
function Update: Boolean; override;
 
end;

function TContainedActionPatch.Update: Boolean;
begin
 Result := False;
end;

function DisableTActionOnUpdate(ActnList: TActionList): Boolean;
var
 I: Integer;
begin
 Result := True;
 
for I := 0to ActnList.ActionCount - 1do
   
if Assigned(ActnList.Actions[I].OnUpdate) then
   
begin
      Result := False;
      Break;
   
end;

 
if Result then
 
begin
    FastcodeAddressPatch(
      FastcodeGetAddress(@TContainedActionUpdateStub),
      @TContainedActionPatch.Update);
 
end;
end;


这段代码的最佳运行位置是在你程序窗体的OnCreate() 事件中。当然如果你希望彻底解决这个问题你可以修改ActnList.pas 中的TContainedAction.Update,或者提交申请让CodeGear 来改进这个问题。

 
总结

本文展示了过多使用TxxxxAction 组件可能会造成应用程序过高的CPU 占用问题。并且提供了补丁代码来解决这个问题。尽管我手上没有最新版本的 Delphi,但是估计这个问题是不会被 CodeGear 修正的。

 
 

你不知道的.NET

-
  • 1970年01月01日 08:00

你可能不知道的shell

  • 2014年10月20日 10:48
  • 46KB
  • 下载

黑匣子:你可能不知道的八件事

下面是关于黑匣子你能够不晓得的一些工作: 1. 它不是黑色的 黑匣子的色彩有点相似于旧金山金门大桥的色彩,是所谓的国际橘。金门大桥的色彩较深,而黑匣子的色彩较亮。 2. 黑匣子包含两...
  • m_mm121
  • m_mm121
  • 2016-10-15 22:49:20
  • 163

CSS3你可能不知道的冷知识

可能我们在看一些网页的源码时 会发现自己从来没见过的属性或用法 今天我就来总结一下 CSS3的冷知识 样式计算在CSS中也可以进行简单的计算 通过calc函数可以实现 这样还可以使我们的元...
  • q1056843325
  • q1056843325
  • 2016-12-02 22:05:28
  • 2484

你可能不知道的10个JavaScript小技巧(真的不是用来装x的)

你可能不知道的10个JavaScript小技巧(真的不是用来装x的)
  • amohan
  • amohan
  • 2016-01-02 12:17:56
  • 401

你可能不知道的5个功能强大的 HTML5 API

原文:http://www.cnblogs.com/lhb25/archive/2012/11/15/more-html5-apis.html 你可能不知道的5个功能强大的 HTML5 API ...
  • WitsMakeMen
  • WitsMakeMen
  • 2013-12-12 11:45:43
  • 1416

数据分析(入门篇)-第一章-高效处理千万数据-Part2(Microsoft Query工具)

第一次使用Microsoft Query功能,感觉局限性相比Access、Oracle还是挺大的。简单的说,就是不好用。 工欲善其事必先利其器,真是至理名言啊! 局限性: 同一Excel文件(iKb)...
  • hpdlzu80100
  • hpdlzu80100
  • 2017-07-05 23:36:09
  • 226

你可能不知道的Shell技巧

1、apt-get install sl 这时候忘记了sudo ,那么只要执行sudo !!,!!表示上一条命令 2、vi hello.c 退出后,如果想打开刚才的hello.c文件,只需要!vi 3...
  • jltxgcy
  • jltxgcy
  • 2014-01-13 11:17:38
  • 1373

HTML和CSS你可能不知道的技巧

1. 禁止鼠标双击选中文本不被双击选中文字的区域 2. 自定义li样式li:{ list-style: none; } li:before{ content: "◆"; dis...
  • chemmuxin1993
  • chemmuxin1993
  • 2016-09-20 12:30:03
  • 636

今天终于看懂了傅立叶变换了。

其实很久前就看懂了。一直是看了忘,忘了再看。本质上并没有理解》。这回找了本老外的书,理解起来容易多了。基本也搞懂了。以下说说大概的理解思路:首先是L2空间,L2空间是一个向量空间,也就是一类在[a b...
  • Nhsoft
  • Nhsoft
  • 2006-01-24 20:11:00
  • 4179
收藏助手
不良信息举报
您举报文章:可能你不知道的 CPU 资源杀手
举报原因:
原因补充:

(最多只允许输入30个字)