Action 造成cpu占用过多的奇怪问题
2008-02-23 07:18:49来源:互联网 阅读 ()
问题说明:
为了维护程序的结构,我在程序中大量使用Action。其优点大家都知道,我可以让MenuItem对应某个Action,同时让工具栏上的Toolbutton也对于相同的Action。这样我只需要对Action进行编程,而MenuItemToolButton都可以相关到这个事件。
不过我发现了一个非常奇怪的问题。当我在程序中创建了4个工具栏。然后初始化程序时动态创建ToolButton(大约40个),同时把他们都关联到不同的Action。(整个程序还只是一个空壳子,所有的Action里面还没有放入代码)我在主窗体上面的空白处(非工具栏区域)移动鼠标,用任务管理器监视。CPU占用率达30%左右(其他程序都关闭了)。如果我动态创建ToolButton的时候先关联Action,然后再取消管理Action,CPU占有率就下降到10%左右。
解决思路:
发现是由于在出发 WM_UPDATE 事件的时候,TActionManager会询问所有 TAction,是否需要响应 OnUpdate 事件。而这个 WM_UPDATE 触发的频率相当频繁,可想而知,不断对所有 TAction 进行询问,需要占用大量的 CPU 时间。在实际运用过程中,这个 OnUpdate 事件几乎不被用到。因此设计了如下的补丁程序。
function TContainedAction.Update: Boolean;
begin {
Result := (ActionList <> nil) and ActionList.UpdateAction(Self) or
Application.UpdateAction(Self) or inherited Update or
(SendAppMessage(CM_ACTIONUPDATE, 0, Longint(Self)) = 1);
}
// ---------------------------------------------------------
// OnUpdate may cause serious performance problem.
// CPU usage is always at about 20-30% (AthlonXP 2100 )
// ---------------------------------------------------------
Result := False; // patched by 5291 2004-05-15
end;
把修改后的 ActnList.pas 拷贝到你的应用程序路径之下然后编译该程序。这个文件修改了原先的Update方法。你的程序可以直接使用新的 ActnList.dcu,你可以用它覆盖原先的组件。
上一篇: 教你如何用Delphi生成GBK码表
下一篇: 基于Delphi的组件设计之概念
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash