Action 的奇怪问题。(200分)

  • 主题发起人 主题发起人 5291
  • 开始时间 开始时间
5

5291

Unregistered / Unconfirmed
GUEST, unregistred user!
为了维护程序的结构,我在程序中大量使用Action。其优点大家都知道,我可以让
MenuItem对应某个Action,同时让工具栏上的Toolbutton也对于相同的Action。
这样我只需要对Action进行编程,而MenuItem和ToolButton都可以相关到这个事件。

不过我发现了一个非常奇怪的问题。当我在程序中创建了4个工具栏。然后初始化程
序时动态创建ToolButton(大约40个),同时把他们都关联到不同的Action。(整个程
序还只是一个空壳子,所有的Action里面还没有放入代码)我在主窗体上面的空白处
(非工具栏区域)移动鼠标,用任务管理器监视。CPU占用率达30%左右(其他程序都关
闭了)。如果我动态创建ToolButton的时候先关联Action,然后再取消管理Action,
CPU占有率就下降到10%左右。

请问各位高手。这个Action的BUG吗?难道我一定要放弃使用Action了?

动态创建TToolButton的代码如下:
function NewButtonWithAction(vAction: TAction; vPopup: TPopupMenu; vStyle: TToolButtonStyle): TToolButton;
begin
Result := TToolButton.Create(Self);
with Result do
begin
Parent := Self;
Action := vAction;
Style := vStyle;
DropdownMenu := vPopup;
ShowHint := True;
{ !!! performance bug }
Action := nil; // If i add this line, CPU usage will be lower.
end;
end;
 
如何关联action??
学习
 
TToolButton的parent应该是TToolBar吧
 
你的机子内存有多大,动态创建是要耗很多内存的,内存不够就要不断用磁盘交换区,CPU
使用率就上去了,你试试增加虚拟内存看看
 
你确信是action的问题吗?我随便问问。
 
一直以静态创建,没注意问题
 
这个和占用多少内存绝对无关吧。
我运行程序的时候也就占8MB内存。
问题在于:我用调试软件一查,发现
-TToolButton.Notification
-TToolbar.Notification
一直在被反复调用。
如果把Action从ToolButton里面解除关联。
这2个事件的调用率明显降低了。
事实上,Action里面并没有任何占资源的处理事件。
为了测试,我特地把所有Action的事件内容清空。
不知道,有谁有知道内情的。
 
我也用Action,不过没发现这样的问题。不知道是不是我的ITEM太少?
 
这是因为在你使用了Action后,在你移动鼠标的时候.Delphi发送
大量的 CM_ACTIONUPDATE 自定义消息以更新每个Action的状态(即
由Taction.onupdate事件处理)。而且即使你的程序不处理任何消息,
application对象也会在onIdle事件中调用DoActionIdle过程更新Action
的状态!
这样Cpu的占用率自然就上去了,其实这也算不上Bug.
 
同意xeen的观点,其实这也是一种HOOK!
 
但问题是:我随便找几个工具栏上有很多按钮的程序,做这个测试。
都没有发现如此恐怖的CPU占用喔。
这个问题总让我心有不安。
 
为什么要返回呢???

procedure NewButtonWithAction(vAction: TAction; vPopup: TPopupMenu; vStyle: TToolButtonStyle);
begin
with TToolButton.Create(toolbar);
////////
begin
Parent := toolbar;
///////
visible:=true;

Action := vAction;
Style := vStyle;
DropdownMenu := vPopup;
ShowHint := True;
{ !!! performance bug }
end;
end;
 
只是返回句柄而已,为了程序使用上的需要。
和这个cpu的bug无关。
 
hehe,还有什么问题吗?事实上就是消息的问题,你随便找个窗口
向它猛发消息,它所在的线程cpu占用率不高才怪.
 
这个极有可能是这样,你的action中没有onexecute事件,而onupdate事件上或别的地方
有将这个action的enabled设为true的代码,而action的onexecute为空时,系统自动会将
他的enabled设为false的,因此,这两个地方,来回的拉锯,造成了系统资源的浪费
 
有没有办法解决阿
 
静态创建应该没问题
 
后退
顶部