Board logo

Subject: 发现编辑器扩展的一个问题,不知该如何解决 [Print This Page]

Author: littlerain    Time: 2006-5-22 22:51     Subject: 发现编辑器扩展的一个问题,不知该如何解决

在CnPack中,编辑器扩展专家在BDS2006下存在一个问题,就是当在IDE中编辑过代码之后,如果关闭所有项目,然后打开IDE的option,或者about窗口都会使得IDE所在的进程的cpu占用率非常高,系统变很慢。
    经过从下载CnWizard最新的0.7.9.194源码,并调试分析后,发现问题出在Utils\CnEditControlWrapper.pas中,这里面的TCnEditControlWrapper包装了IDE本身的
EditControl。
    而TCnEditControlWrapper.OnIdle()事件的处理代码中调用了GetEditorContext(),
如果GetEditorContext()当关闭所有编辑器之后被调用的话,就会抛出AccessViolation异常,
经过单步调试发现,实际上是这个时候EditView发生了变化,这个时候EditView.Buffer=nil,
所以访问EditView.Buffer.GetCurrentDate会抛出AccessViolation异常,
同时,访问EditView.Block似乎也会抛出AccessViolation异常。
    由于OnIdle事件被不停的调用,并且OnIdle事件的代码中不断的调用GetEditorContext(),
所以导致不断的抛出异常,从而导致cpu占用率非常高,IDE反应非常慢。
    所以,我想问题可能出在当IDE中所有的EditControl被关闭后(实际上应该是被隐藏了),
EditView不知道发生了什么变化,而TCnEditControlWrapper又没有及时收到更新通知,从而导致访问异常。
    小弟水平太差,一直想不到有什么好方法能够解决这个问题,期待CnPack早日解决这个问题。大家也来一起想想办法吧,为CnPack进步贡献一把力。
Author: shenloqi    Time: 2006-5-30 09:28

procedure TCnEditControlWrapper.OnIdle(Sender: TObject);
var
  i: Integer;
  Context, OldContext: TEditorContext;
  ChangeType: TEditorChangeTypes;
begin
  for i := 0 to EditorCount - 1 do
  begin
    //应该只要加上这段就可以了吧,Buffer都是nil了的话就应该不需要处理了吧
    if Editors[i].FEditView.Buffer = nil then
      Continue;
Author: my58876448    Time: 2006-5-31 08:34     Subject: 支持,加油


Author: littlerain    Time: 2006-5-31 23:32

to shenloqi:
   我试过加上这句话,但是问题在于这个时候访问FEditView.Buffer就会引发异常,也就是这个if判断的时候就引发异常了,而FEditView这个时候又不是nil,不知道指到了哪里




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0