CnPack Forum


 
Subject: 使用专家包时发现Delphi的Cpu占有率极高?
xu2000
新警察
Rank: 1



UID 25479
Digest Posts 0
Credits 10
Posts 3
点点分 10
Reading Access 10
Registered 2007-9-8
Status Offline
Post at 2007-9-10 00:39  Profile | Blog | P.M. 
使用专家包时发现Delphi的Cpu占有率极高?

我非常喜欢专家包中的一些功能。本来是在单位用的家里不用的。
最近把它拿到家中装上后,发现一启动专家包后,Delphi的CPU占有用可达50%-80%,一禁用就没有问题了,让我十分的不解。希望能得到指点。
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6812
Posts 3579
点点分 6812
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-9-10 01:22  Profile | Blog | P.M. 
专家包在应用程序OnIdle的时候做了不少事情,因此容易引起CPU占用率过高。同时由于某些IDE的bug也容易导致Idle时频繁出Exception导致CPU占用高。
请问您用的专家包是什么版本,IDE是什么版本?
Top
xu2000
新警察
Rank: 1



UID 25479
Digest Posts 0
Credits 10
Posts 3
点点分 10
Reading Access 10
Registered 2007-9-8
Status Offline
Post at 2007-9-10 22:47  Profile | Blog | P.M. 
我最开始是下了CnWizards_0.8.2.331_RC2这个版本的并装上去,发现CPU占有率太高了。
单位用的是CnWizards_0.8.2.322_RC1,这在单位用的时候一点问题都没有。
后来我把家里的高版本的卸了,装上单位用的,但也不行。
我家里和单位的IDE都是Delphi7.0。
实在是搞不明白。
Top
stephenmax (绿毛虫)
普通灌水员
Rank: 2



UID 4757
Digest Posts 0
Credits 91
Posts 44
点点分 91
Reading Access 10
Registered 2007-1-19
Location SNDA
Status Offline
Post at 2007-9-11 09:21  Profile | Site | Blog | P.M.  | QQ
我发现关闭fastcode优化后,ide无论稳定性还是cpu占用率都有比较好的改善
我用的2007,如果开着fastcode优化,工程一大,文件一多,有时候会莫名其妙报错
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-9-11 16:24  Profile | Blog | P.M. 
这个问题我早就提过,
cw借由OnIdle事件来分析代码,判断当前代码更改状态等信息,
通常,在一般的程序中OnIdle只有空闲时触发一次,但是不知道为什么在IDE中一直不断地触发,
这可能是IDE的某些Bug或是一些其它的额外的线程导致IDE从空闲回到忙然后又恢复到空闲,从而再次触发OnIdle事件
有点像一个死循环,但是又不同于死循环

不同的版本的IDE触发OnIdle的频率不一样,D10约1秒一次,D11少于半秒一次,所以cw在D11中使用比d10更占用资源
OnIdle有个Done boolean类型的参数,我曾试着加以控件以期减速少OnIdle触发次数,但是由于本人功力不够,没有得逞

不知道Passion和Zjy有没有更好的法子或是不要OnIdle事件

----
我刚好在我的程序中使用大量的线程,但我发现一个奇怪的问题,同样的代码,线程在dll或是bpl中退不出来,在Exe中却能正常退出,不知会不会passion和zjy有帮助

[ 本帖最后由 niaoge 于 2007-9-11 16:29 编辑 ]
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6812
Posts 3579
点点分 6812
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-9-11 16:32  Profile | Blog | P.M. 
Idle是连续不断触发的。VCL代码中写的是当应用程序主窗体消息队列中无消息时便会被调用。
我们在OnIdle里头加了延时机制以减少了调用次数。照理说1秒一次或半秒一次的话,不会太占CPU的。就怕onidle中调用的代码触发了excpetion等比较费时的操作。
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-9-12 18:05  Profile | Blog | P.M. 
有两个地方我改了,
不知道对不对,

所有全局变量 HHOOK (3-4个pas文件有)全部不要,然后 CallNextHookEx第一个参数改成 HHOOK(nil)
(有资料显示,dll中HHOOK可以不要,我本人是不怎么懂,也没有深入地研究过)
CnEditControlWrapper.pas 内 GetEditorContext这个函数内 Result.ModTime := Editor.EditView.Buffer.GetCurrentDate 不要
然后,当比较OldContext 与 Context 没有ctModified时,再次通过另一个函数获得ModTime这个值

经过这样改动之后,bds.exe 的cup占用率从原来的30-50%降到10%以下,目前没发同使用当中出错的地方,
不知道对不对,错了不要扔砖头啊
Top
niaoge
灌水司司长
Rank: 6Rank: 6



UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
Post at 2007-9-13 09:26  Profile | Blog | P.M. 
CnWizUtils.pas有四个函数
CnOtaGetFormEditorFromModule,
CnOtaGetCurrentSourceFile,
CnOtaGetCurrentModule,
CnOtaGetProjectGroup,
这四个函数的值能不能做成一个全局变量,通过判断当前工程文件状态一次性更新,然后直接取这些值
虽然这四个函数单次执行不耗时,但是执行次数非常多(半个小时之内有上百万次),加起来还是很耗时,
我现在的的代码,这四个函数耗时最多
Top
 




All times are GMT++8, the time now is 2024-9-20 06:12

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009467 second(s), 9 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP