指针的使用(一个内存老虎的程序,请大家来帮忙让老虎变小猫,请大侠们一定要进来看看)(150分)

  • 主题发起人 主题发起人 PowerDelphi
  • 开始时间 开始时间
P

PowerDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一段程序不知错在什么地方,我在implementation部分声明了如下类型:
type
;TProcessInfo=Record
; ; ExeFile:string;
; ; ProcessID:DWORD;
;end;
;PProcessInfo=^TProcessInfo;
然后有以下过程:
procedure TForm1.Timer1Timer(Sender: TObject);//Timer1.interval:=1000
var
;p:PProcessInfo;
;i:integer;
;ContinueLoop:Boolean;
;FSnapshotHandle:THandle;
;FProcessEntry32:TProcessEntry32;
;hh:HWND;
begin
;FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
;FProcessEntry32.dwSize :=SizeOf(FProcessEntry32);
;ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
;while integer(ContinueLoop)<>0 do
;begin
; ;new(p);
; ;p.ExeFile :=FProcessEntry32.szExeFile ;
; ;i:=checklistbox1.Items.IndexOf(lowercase(extractfilename(p.ExeFile)));
; ;if i>=0 then
; ;begin
; ; ;p.ProcessID :=FProcessEntry32.th32ProcessID ;
; ; ;hh:=OpenProcess(PROCESS_ALL_ACCESS,true,p.ProcessID);
; ; ;TerminateProcess(hh,0);
; ; ;application.MessageBox ('此程序被禁止在本机运行,请与管理员联系!','禁止运行 ; ; ; ; ; ; ; ; ; ; ; ',MB_ICONINFORMATION+MB_OK);
; ;end;
; Dispose(p);
; ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
;end;
end;
这个程序运行达到了我的目的:根据程序来关闭要想关闭的程序,但是一个非常严重的问题产生了:内存的使用太惊人了。开始我运行这个程序前可用物理内存是
116MB(RamIdle测得),这是退出RamIdle改用WindowsMe自带的“系统监视器”继续监测可用物理内存,大约5分钟过后,可用物理内存变为91.2MB,这时退出这个程序,可用物理内存又突增至116MB(系统监视器测得),过一会儿后又增至116.2MB后来一直稳定在116MB这个水平没有变化。我明明是new(p)后又Dispose(p)不知我错在什么地方,怎样才能避免这种情况,请大侠们指点迷津。不盛感激!!!
 
会不会是不断OpenProcess的原因?它得到了一个Handle,却没有释放?
呵呵,不确定,瞎猜的
 
不是吧? 连发? ;没办法,还是这个答安啊:[:D][:D][:D]

最后要加一句: CloseHandle(FSnapshotHandle);
不懂你为什么要用指针。 直接P: TProcessInfo;不就行了?不过这一部份是没有问题的。
另外
; ; ;hh:=OpenProcess(PROCESS_ALL_ACCESS,true,p.ProcessID);
; ; ;TerminateProcess(hh,0);
这两句后面不知还要不要加CloseHandle(hh); 如果不是TerminateProcess的话,那是必然的
但是TerminateProcess之后还要不要加就不知道了,你可以试一下,如果加上去不出错就加吧。
 
多人接受答案了。
 
后退
顶部