Guest:
Register
|
Login
|
Member List
|
Search
|
Statistics
|
FAQ
Language
----------
Simplifed Chinese
Traditional Chinese
English
CnPack Forum
»
CnPack IDE 专家包(CnWizards)
» 使用专家包时发现Delphi的Cpu占有率极高?
‹‹ Last Thread
|
Next Thread ››
Poll
Trade
Reward
Activity
Printable Version
|
Email to Friend
|
Subscription
|
Favorites
Subject: 使用专家包时发现Delphi的Cpu占有率极高?
xu2000
新警察
UID 25479
Digest Posts 0
Credits 10
Posts 3
点点分 10
Reading Access 10
Registered 2007-9-8
Status Offline
#1
Post at 2007-9-10 00:39
Profile
|
Blog
|
P.M.
使用专家包时发现Delphi的Cpu占有率极高?
我非常喜欢专家包中的一些功能。本来是在单位用的家里不用的。
最近把它拿到家中装上后,发现一启动专家包后,Delphi的CPU占有用可达50%-80%,一禁用就没有问题了,让我十分的不解。希望能得到指点。
Passion
(LiuXiao)
管理员
UID 359
Digest Posts
19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
#2
Post at 2007-9-10 01:22
Profile
|
Blog
|
P.M.
专家包在应用程序OnIdle的时候做了不少事情,因此容易引起CPU占用率过高。同时由于某些IDE的bug也容易导致Idle时频繁出Exception导致CPU占用高。
请问您用的专家包是什么版本,IDE是什么版本?
xu2000
新警察
UID 25479
Digest Posts 0
Credits 10
Posts 3
点点分 10
Reading Access 10
Registered 2007-9-8
Status Offline
#3
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。
实在是搞不明白。
stephenmax
(绿毛虫)
普通灌水员
UID 4757
Digest Posts 0
Credits 91
Posts 44
点点分 91
Reading Access 10
Registered 2007-1-19
Location SNDA
Status Offline
#4
Post at 2007-9-11 09:21
Profile
|
Site
|
Blog
|
P.M.
|
我发现关闭fastcode优化后,ide无论稳定性还是cpu占用率都有比较好的改善
我用的2007,如果开着fastcode优化,工程一大,文件一多,有时候会莫名其妙报错
niaoge
灌水司司长
UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
#5
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 编辑
]
Passion
(LiuXiao)
管理员
UID 359
Digest Posts
19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
#6
Post at 2007-9-11 16:32
Profile
|
Blog
|
P.M.
Idle是连续不断触发的。VCL代码中写的是当应用程序主窗体消息队列中无消息时便会被调用。
我们在OnIdle里头加了延时机制以减少了调用次数。照理说1秒一次或半秒一次的话,不会太占CPU的。就怕onidle中调用的代码触发了excpetion等比较费时的操作。
niaoge
灌水司司长
UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
#7
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%以下
,目前没发同使用当中出错的地方,
不知道对不对,错了不要扔砖头啊
niaoge
灌水司司长
UID 9910
Digest Posts 0
Credits 438
Posts 143
点点分 438
Reading Access 10
Registered 2007-4-8
Status Offline
#8
Post at 2007-9-13 09:26
Profile
|
Blog
|
P.M.
CnWizUtils.pas有四个函数
CnOtaGetFormEditorFromModule,
CnOtaGetCurrentSourceFile,
CnOtaGetCurrentModule,
CnOtaGetProjectGroup,
这四个函数的值能不能做成一个全局变量,通过判断当前工程文件状态一次性更新,然后直接取这些值
虽然这四个函数单次执行不耗时,但是执行次数非常多(半个小时之内有上百万次),加起来还是很耗时,
我现在的的代码,这四个函数耗时最多
Poll
Trade
Reward
Activity
CnPack Forum
CnPack English Forum
> CnWizards IDE Wizards
> CVSTracNT
> Announcements & Others
All times are GMT++8, the time now is 2024-11-27 12:00
Powered by
Discuz!
5.0.0
© 2001-2006
Comsenz Inc.
Processed in 0.009803 second(s), 9 queries , Gzip enabled
TOP
Clear Cookies
-
Contact Us
-
CnPack Website
-
Archiver
-
WAP
Member's CP Home
Edit Profile
Credits Transaction
Public User Groups
Buddy List
Main
Page Views
User Agents
Posts History
Top Forums
Top Threads
Post Ranking
Credit Ranking
Online Time
Team
Moderation Stats