使用Delphi将内存使用放在TProgressBar.position中

问题描述 投票:-1回答:1

我想知道如何使用正在使用的计算机的内存使用量并将数量放入TProgressBar组件中。

我知道可以将CPU使用率放在那里,但我不知道如何使用Memory。我该怎么做呢?

windows delphi memory vcl
1个回答
2
投票

我想我得到了你需要的东西。

unit RamMonitor;

interface

uses
  Classes, Windows, SyncObjs;

type
  TOnRefresh = Procedure(RAMUsage: Double) of object;
  TOnRefreshExt = Procedure(RAMUsage: Double; RAMTotal, RAMFree, RAMUsed: Integer) of object;

type
  TRAMMonitor = class(TThread)
    private
      FPauseEvent : TEvent;
      FOnRefresh: TOnRefresh;
      FOnRefreshExt: TOnRefreshExt;

      FRefreshInterval: Integer;
      FRAMUsage: Double;
      FRAMTotal: Integer;
      FRAMFree: Integer;
      FRAMUsed: Integer;

      procedure ReportRAMUsage;
      procedure CheckForPause;
    public
      property RefreshInterval : Integer read FRefreshInterval write FRefreshInterval;
      property OnRefresh: TOnRefresh read FOnRefresh write FOnRefresh;
      property OnRefreshExt: TOnRefreshExt read FOnRefreshExt write FOnRefreshExt;

      constructor Create; reintroduce;
      destructor Destroy; override;
      procedure Pause;
      procedure UnPause;
    protected
      procedure Execute; override;
  end;

const
  ONEMEGABYTE   = 1024 * 1024;
  INTERVAL      = 5000; //ms

implementation

constructor TRAMMonitor.Create;
begin
  inherited Create(true);

  FPauseEvent := TEvent.Create(nil, true, true, '');
  FRefreshInterval := INTERVAL;
end;

destructor TRAMMonitor.Destroy;
begin
  if not Terminated then
    Terminate;
  FPauseEvent.Free;
  inherited;
end;

procedure TRAMMonitor.CheckForPause;
begin
  FPauseEvent.WaitFor(INFINITE);
end;

procedure TRAMMonitor.Pause;
begin
  FPauseEvent.ResetEvent;
end;

procedure TRAMMonitor.UnPause;
begin
  FPauseEvent.SetEvent;
end;

procedure TRAMMonitor.Execute;
var
  x, y : real;
  memory: Windows.TMemoryStatus;
begin
  repeat
    CheckForPause;
    // memory
    memory.dwLength := SizeOf(memory);
    GlobalMemoryStatus(memory);
    x := memory.dwTotalPhys - memory.dwAvailPhys;
    y := memory.dwTotalPhys;
    FRAMUsage := ((x/y)*100);
    FRAMTotal := round(memory.dwTotalPhys/ONEMEGABYTE);
    FRAMFree := round(memory.dwAvailPhys/ONEMEGABYTE);
    FRAMUsed := round((memory.dwTotalPhys - memory.dwAvailPhys)/ONEMEGABYTE);

    Synchronize(ReportRAMUsage);
    sleep(FRefreshInterval);
  until (Terminated);
end;

procedure TRAMMonitor.ReportRAMUsage;
begin
  if Assigned(OnRefresh) then
    OnRefresh(FRAMUsage);

  if Assigned(OnRefreshExt) then
    OnRefreshExt(FRAMUsage, FRAMTotal, FRAMFree, FRAMUsed);
end;

end.

在你的主要的初始代码中:

FRAMUsage := TRamMonitor.Create;
FRAMUsage.RefreshInterval := 15000; // 15s
FRAMUsage.OnRefresh := RefreshRamUsage;
FRAMUsage.Unpause; // in order to make the thread run

这里是刷新过程,在这个例子中,用法是百分比,所以你需要将max设置为100.第二个事件(在这个例子中没有使用)提供了有关内存使用量的更多细节,以兆字节为单位。

procedure TfrmMain.RefreshRamUsage(Usage: Double);
var
  NewPos : Integer;
begin
  NewPos := Trunc(Usage);
  pbRamUsage.Position := NewPos;
end;

心连心

© www.soinside.com 2019 - 2024. All rights reserved.