Action 造成cpu占用过多的奇怪问题

2016-01-29 14:03 15 1 收藏

Action 造成cpu占用过多的奇怪问题,Action 造成cpu占用过多的奇怪问题

【 tulaoshi.com - Delphi 】

 
问题说明:

  为了维护程序的结构,我在程序中大量使用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 事件几乎不被用到。因此设计了如下的补丁程序。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/)


  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,你可以用它覆盖原先的组件。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/delphi/) 

来源:https://www.tulaoshi.com/n/20160129/1492389.html

延伸阅读
标签: 浏览器
火狐浏览器占用过多内存的解决方法 火狐在有些情况下会占用较多的内存(RAM),导致浏览器的反应速度较慢,在极端的情况下甚至会导致浏览器崩溃。下面介绍几种方法帮助减少火狐的内存占用,让您更有效地使用火狐浏览器。 检查安装的附加组件 安装的附加组件(包括扩展、主题、插件)造成浏览器占用过多内存的情况比较常见。 您...
标签: 电脑入门
有很多朋友都感觉使用QQ上网时,程序运行一段时间后电脑就变得很缓慢,用任务管理器查看进程发现CPU的占有率很高,也不是电脑中毒的问题。 其实,造成这种QQ占用CPU资源过高的情况可能和你的QQ软件的设置有关系,通过修改QQ的设置就可以解决问题。 1、降低qq群频繁弹出信息,将一些不经常使用的QQ群的自动弹出的聊天信息屏蔽,定期清理qq群里...
标签: 电脑入门
有很多朋友都感觉使用QQ上网时,程序运行一段时间后电脑就变得很缓慢,用任务管理器查看进程发现CPU的占有率很高,也不是电脑中毒的问题。 其实,造成这种QQ占用CPU资源过高的情况可能和你的QQ软件的设置有关系,通过修改QQ的设置就可以解决问题。 第一:降低qq群频繁弹出信息,将一些不经常使用的QQ群的自动弹出的聊天信息屏蔽...
经常看见有人问,MSSQL占用了太多的内存,而且还不断的增长;或者说已经设置了使用内存,可是它没有用到那么多,这是怎么一回事儿呢? 首先,我们来看看MSSQL是怎样使用内存的。 最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给...
标签: 电脑入门
如果电脑经常出现CPU占用100%的情况,主要问题可能发生在下面CPU占用率高的九种可能的某些方面: 1、防杀毒软件造成故障 由于新版的KV、金山、瑞星都加入了对网页、插件、邮件的随机监控,无疑增大了系统负担。处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,或者,升级你的硬件配备。 2、驱动没有经过认证,造成CPU资源占用100...

经验教程

86

收藏

83
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部