为什么程序运行会变慢? 300分(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
如果指针没有释放会发生内存泄漏,表现为内存不断减少.
但是我的程序没有这个问题亚.

变慢似乎是比较突然的,不是慢慢变慢的. 但是我没有做任何特别的操作,
一直就是在拷贝/粘贴. :-(
 
;可能是内存管理上的问题吧。因为新实例不慢,所以可以排除数据库的问题。
Delphi的变量都是在堆中申请。包括你定义的指针、剪贴版。你可以看看TList
的源码,主要是FCapacity的作用。另外,可不可以将自定义的剪贴版用内存映像
文件处理,不用Windows的。
我看,最主要的可能是在:你的剪贴版只有一个,每次申请新内存后,它的长度
都在增加,尽管后来都释放了,但总长度在增加,因而申请内存时数据移动慢了。

也许是别的原因。
 
zensst: 如果真实建铁板问题,如何解决呢?
我不能用其他传递数据的方法,因为我要求复制的数据在我程序退出后
还可以被别的程序实例使用.
 
;这个我就不是很清楚。关键看别的程序是否是你做的了。如果是,就可以自己定
义一种文件或流格式来传递。
 
一启动就有8个线程,放了什么控件进去?
 
讨论的激烈呀,我来看看的,长见识,得经验:)
 
zensst: 用文件不能达到剪贴版的作用吧?
"别的程序"就是这个程序的"别的实例",但是不一定同时运行的,
如果用剪贴版就可以不管什么时候都能够交换数据.

pipi: 我想一想...用了ODBC98,Handle和我自己写的2个控件.
handle就是那个能够运行时移动控件的东西(就像delphi IDE)
 
用CopyData呢?--瞎说(俺也没用过)
 
CopyData也需要对方程序一定要在运行才能传递消息呀!

如果用剪贴版,就可以任何时候访问该数据.
 
-)cAkk
我以为一定要先定位问题在哪儿
是连续操作到一定积累后出现呢(是否有规律)
还是具体某一操作之后出现
否则猜来猜去都是没用
 
我再琢磨一下.
 
如果你是想粘贴控件的话,可以看下面,是安全的。
Pan2是TPanle;OpenDP是TOpenDialogPicture;Image是TIamge。
看了看ClipBoard的源码,它是自动Empty了的。

procedure TFDGraphs.Button9Click(Sender: TObject);
begin
if not OpenDP.Execute then Exit;
Image.Picture.LoadFromFile(OpenDP.FileName);
end;

procedure TFDGraphs.Button7Click(Sender: TObject);
var C: TControl;
begin
C:=Image;
Image.Name:='Image'+IntToStr(Pan2.ControlCount);
ClipBoard.SetComponent(C);
Image:=TImage(C);
Image.Name:='Image';
Image:=TImage(C);
ClipBoard.GetComponent(Self, Pan2); //可以在其他程序中实现。
end;

procedure TFDGraphs.Button8Click(Sender: TObject);
var I: Integer;
begin
for I:=Pan2.ControlCount-1 downto 0
do begin
Pan2.Controls.Free;
end;
end;

initialization
RegisterClass(TImage);
 
8个线程?你自己开了几个?你可以先把自己写的线程逐个去掉,看看
是否是线程中处理不当!
 
zensst: 我是要粘贴控件,但问题是同时可能有很多控件一起粘贴,你的方法
能做到吗?

wuyi: 我自己一个线程也没有开.
 
好象不行。但是你可以从TClipBoard继承一个新控件,扩展它的
SetComponent和GetComponent方法。从源码看,只需要加一个循环就行了;
在Set时,将多个Component Write到Stream中,Get是先分开,再用TReader
装配就行了。应该可以的。
 
如果把component都一起放在剪貼版裏面,我如何區分每個component在stream裏面
的界限呢?
而且我的每個控件還附帶一些附加的内容,這些信息怎麼辦?
 
查查
(1)有循环语句
(2)有否应该初始化的变量没有初始化
 
你的问题可能在数据库操作上,看看是不是对没有主键或索引的表进行了
频繁的更新,
》》如果把component都一起放在剪貼版裏面,我如何區分每個component在stream裏面
的界限呢?

你只要按顺序写,按顺序读就可以了。
 
直觉上是剪贴板造成的。 剪贴板本身有时就会慢。 比如一次COPY几M的内容。
如果程序里再处理不当,频繁/循环地处理剪贴板就好象似乎可能也许。。。。
 
;的确可能是剪贴板的问题,试试有没有重新加载剪贴版的方法。
另外,可以在程序已经变慢后,在有GetMem、ReallocMem等方法的地方设置断点
看看,是不是这些地方有点慢。
 
后退
顶部