可能你不知道的 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 修正的。

 
点击这里查看本文的英文版本
 

可能你不知道的TClientDataset功能

keyLife富翁笔记   作者: shiningplus 标题: delphi Midas SQLServer的自增字段的处理  关键字: delphi Midas 自增字段  分类:...
  • onebigday
  • onebigday
  • 2016年02月29日 08:59
  • 1648

android String 资源 你所不知道的

android String 资源 你所不知道的 转载自: http://www.cnblogs.com/over140/archive/2011/10/20/2218560....
  • Chuekup
  • Chuekup
  • 2013年05月15日 10:43
  • 1287

解决“**无法访问,你可能没有权限使用网络资源,请与管理员联系,拒绝访问!"

电脑出现“XXX无法访问。你可能没有权限使用网络资源......”,ping得通,即使重新系统也不能解决 。   方法一:出现这一类的问题有可能的防毒软件可能出于安全考虑做了什么设置,让电...
  • CS41806516
  • CS41806516
  • 2014年12月29日 11:43
  • 25466

你不知道的JavaScript(上卷)(0分资源)

  • 2017年07月05日 11:26
  • 10.3MB
  • 下载

sjone.exe垃圾高度占用cpu的处理(不知道这是一个什么东西)

sjone.exe的进程在高度占用cpu 好可怕,要是平时不小心开机没注意 岂不是一直被占用损耗...
  • eebaicai
  • eebaicai
  • 2017年11月30日 17:17
  • 388

你真的不知道你的CPU到底有多强!

经常关注“科技你好”的大大们肯定对手机的性价比早有耳闻,什么是性价比?技哥认为花少钱买好货就是高性价比,都说你的手机性价比高,为啥高?除了摄像头好,RAM高,颜值漂亮,最最重要的就是CPU了。今天给大...
  • M7720EIoSi6oA9
  • M7720EIoSi6oA9
  • 2017年12月23日 00:00
  • 99

你不知道的 CPU 原理

当我们操作电脑时,每一条指令是如何在 CPU 中执行的呢,本文将带你了解 CPU 的内芯世界。...
  • Henzox
  • Henzox
  • 2014年11月13日 15:33
  • 1819

你不知道的Kettle学习笔记3--Kettle资源库

一、Kettle资源库概述1、kettle资源库保存的是Kettle元数据。 2、资源库包括文件资源库、数据库资源库。在服务端新建资源库,只能使用数据库资源库。 3、不使用资源库:直接保存为ktr...
  • lin434406218
  • lin434406218
  • 2016年09月26日 08:14
  • 1368

你所不知道的android开发图标资源站

1.Iconfinder 这个网站的界面非常干净,它只有一个目的:为你的web项目找到合适的图标。在搜索框中输入关键字,你便会得到一组自动滚动加载的图标。 网站也提...
  • xiaoluoli88
  • xiaoluoli88
  • 2016年04月19日 21:11
  • 3711

【资源篇】Python那么火,你还不知道如何人门?

Python 前言Python 是一种面向对象的解释型计算机程序设计语言。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起 。...
  • liliangpin
  • liliangpin
  • 2017年11月01日 14:57
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可能你不知道的 CPU 资源杀手
举报原因:
原因补充:

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