想自己做一个内存优化软件吗?这是一个内存优化组件的源码 (0分)

  • 主题发起人 主题发起人 Bahl
  • 开始时间 开始时间
B

Bahl

Unregistered / Unconfirmed
GUEST, unregistred user!
{$WARNINGS OFF}
{$HINTS OFF}
unit MaxMem;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TOnProgress = procedure(Sender: TObject;Progress:Integer) of object;
TMaxMem = class(TComponent)
private
FAbort : Boolean;
FTotalMemory : Integer;
{ Your Computer RAM in Bytes }
FWorking : Boolean;
FOnProgress : TOnProgress;
FOnBeforeDefrag ,
FOnAfterDefrag : TNotifyEvent;
Function GetFreeMemory:Integer;
{ In Bytes }
protected
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
procedure DefragMemory(MemoryLimit:Integer);
{ Watchout! In MEGABYTES }
Procedure Abort;
Procedure DefragAll;
published
property TotalMemory : Integer Read FTotalMemory;
property FreeMemory : Integer Read GetFreeMemory;
{ Events }
property OnBeforeDefrag : tNotifyEvent Read FOnBeforeDefrag Write FOnBeforeDefrag;
property OnProgress : TOnProgress Read FOnProgress Write FOnProgress;
property OnAfterDefrag : tNotifyEvent Read FOnAfterDefrag Write FOnAfterDefrag;
end;

procedure Register;
implementation
constructor TMaxMem.Create(AOwner: TComponent);
var MS : tMemoryStatus;
begin
inherited Create(AOwner);
MS.dwLength:=sizeof(MS);
GlobalMemoryStatus(MS);
FTotalMemory:=MS.dwTotalPhys;
end;

destructor TMaxMem.Destroy;
begin
inherited Destroy;
end;

Procedure TMaxMem.Abort;
begin
FAbort:=True;
end;

Procedure TMaxMem.DefragAll;
begin
DefragMemory(TotalMemory div (1024*1024));
end;

Function TMaxMem.GetFreeMemory:Integer;
var MS : tMemoryStatus;
begin
MS.dwLength:=sizeof(MS);
GlobalMemoryStatus(MS);
Result:=MS.dwAvailPhys;
end;

procedure TMaxMem.DefragMemory(MemoryLimit:Integer);
var
Pointers : Array [0..1024] of Pointer;
Limit ,
I2,
I : Integer;
P : Pointer;
Step : Integer;
Steps : Integer;
begin
FAbort := False;
If FWorking then
Exit;
FWorking:=True;
Limit:=MemoryLimit;
If Limit>1024 then
Limit:=1024;
If Assigned(FOnBeforeDefrag) then
FOnBeforeDefrag(Self);
{ Calculating how many steps...}
Steps:=(MemoryLimit*2);
Step:=0;
{ Clean pointer...}
For I:= 0 to Limit do
Pointers:=nil;
{ Allocating Memory }
For I:=0 to Limit-1 do
begin
P:=VirtualAlloc(nil, 1024*1024, MEM_COMMIT, PAGE_READWRITE + PAGE_NOCACHE);
Pointers:=p;
asm
pushad
pushfd
mov edi, p
mov ecx, 1024*1024/4
xor eax, eax
cld
repz stosd
popfd
popad
end;
Inc(Step);
If Assigned(FOnProgress) then
OnProgress(Self,Round((Step/Steps)*100));
If FAbort then
begin
For I2:=0 to I do
begin
VirtualFree(Pointers[I2], 0, MEM_RELEASE);
end;
Step:=(MemoryLimit*2);
FWorking:=False;
If Assigned(FOnAfterDefrag) then
FOnAfterDefrag(Self);
Exit;
end;
end;

{ DeAllocating Memory }
For I:=0 to Limit-1 do
begin
VirtualFree(Pointers, 0, MEM_RELEASE);
Inc(Step);
If Assigned(FOnProgress) then
OnProgress(Self,Round((Step/Steps)*100));
If FAbort then
begin
{ Warning! : Force abort, w/o de-allocating memory }
Step:=(MemoryLimit*2);
FWorking:=False;
If Assigned(FOnAfterDefrag) then
FOnAfterDefrag(Self);
Exit;
end;
end;

FWorking:=False;
If Assigned(FOnAfterDefrag) then
FOnAfterDefrag(Self);
end;

procedure Register;
begin
RegisterComponents('Jazarsoft', [TMaxMem]);
end;

end.
这个组件的基本原理参考了"Memory Defragmenter for Windows" 这篇文章,
我过一阵子争取把它翻译并贴上来。
请帮忙将它提前。
 
gz

-----
http://www.8421.org
 
gz是什么意思?
 
to bahl:
gz的意思就是“关注‘
拼音的第一个字母
你写的组件,为什么不弄成可以下载的呢?
也许我问的笨点啊,因为我才学的delphi,很多不懂
大侠指点
 
这个东东怎么用?
难道是在 Application.run 前面先优化一下内存吗?
 
to 跳动的火焰:
您只要Copy再Paste一下就行了,何必费工夫去下载呢?
to iCANK:
MaxMem.DefragAll;整理全部内存;
MaxMem.DefragMemory(n);整理百分之n的内存。
MaxMem.Abort;放弃整理内存;
 
to bahl:
大哥,可以做一个例子放出来吗?小弟才接触delphi,不是很明了啊
麻烦了~:)
 
OK
您的E_Mail?
 
give me too,thank you
ctx@21cn.com
 
谢谢bahl,我的email是:
loveislong@sina.com
或者:
loveislong@163.com
如果你是用163邮箱的话,就帮忙发到163.com去吧
现在新浪都很难接收163的信
谢谢了啊
 
考,这么去整理内存是否太黑了???
你的意思就是要把现在物理内存中的页面都挤到硬盘上去???这就是内存整理??!!
而且那段汇编也是不必要,用不着把1m的内存全部清0吧!你只要往这个页面上写一个字节,这个页面就会自动映射到物理内存上。
看了这个程序,我是不敢再用内存整理软件的了........
 
整理内存的软件,根本就是将内存数据往硬盘挤!对于64/32M的机器来说是有点用的,
我在32M的电脑上运行股票软件,就要这种定时将内存数据往硬盘挤的程序帮忙。
 
To timerri:
您有什么更好的方法,可以提出来嘛。否则请您不要冷嘲热讽。
 
to Bahl
呵呵,看来我说过头了......别介意
我原来可从来没有了解过任何有关内存整理方面的原理。见到这个例子,真是吓了我一跳,这跟我原先想象的内存整理方式差得太远了......
其实你这个程序本身写得不错,一个控件该有的东西都有了,又有virtualalloc,virtualfree的使用方法,作为学习资料还是不错的
我所想的内存整理软件,应该能够接管windows的页管理,能够有比windows更好的页调度管理策略。而不是像这样仅仅只是腾出物理内存而已。希望我以后能够看到这样的产品诞生....
 
后退
顶部