{-----------------------------------------------------------------------------
 Unit Name: uCPUMem
 Author:    8jie
 Purpose:   CPU/内存相关公共函数，
            将常用的函数精简出来，以供开发者更简单的开发脚本
 History:
   2009-05-08: + Create this file
-----------------------------------------------------------------------------
           Copyright(c) 8-jie 2009
-----------------------------------------------------------------------------}


{--- 使用方法 ---
  在脚本中使用uses uCpuMem，并在OnWidgetInit中调用StartCpuMemWatch;在OnWidgetClose中调用StopCPUMEMWatch
之后在脚本中即可使用cpuCount(CPU核心数),TotalMem(总内存数)等变量，还可使用以下函数
  system.Machine.CPUs.processorArchitecture    //CPU架构：x86或amd
  system.Machine.cpus.usagePercentage          //平均CPU使用率
  system.Machine.cpus.items[i].usagePercentage //指定CPU核心的使用率
  system.Machine.availableMemory               //可用内存（以M为单位）
  round((TotalMem-system.Machine.availableMemory)*100/TotalMem) //内存使用率
-----------------------------------------------------------------------------}

var
  cpuCount:integer; //CPU核心数
  TotalMem:Int64;   //总内存数

//开始CPU监测
procedure StartCpuMemWatch;
begin
  TotalMem:=system.Machine.totalMemory; //GetMemoryInfo('TotalPhys');
  cpuCount:=system.Machine.CPUs.count;
  system.Machine.Cpus.Active:=true;
end;

//停止CPU监测
procedure StopCPUMEMWatch;
begin
  system.Machine.Cpus.Active:=false;
end;

//将内存大小转换成合适的单位，此处的参数以M为单位，因为system.Machine.availableMemory返回的数据是以M为单位的，而不是字节，注意！！！
function GetMSize(value:Integer):string;
var
  i:integer;
  f:double;
  s:string;
begin
  result:='';
  //计算剩余容量
  i:=0;
  f:=value;
  while f>1024 do
  begin
    inc(i);
    f:=f/1024;
  end;
  case i of
    0: s:='MB';
    1: s:='GB';
    2: s:='TB';
  else
    s:='MB';
  end;
  //下面这一行会导致程序异常，不知道为什么:(
  //result:=format('%.1f %s',[f,s]);
  i:=round(f*10);
  if i mod 10=0 then
    result:=format('%d %s',[i div 10,s])
  else
    result:=format('%.1f %s',[i/10,s]);
end;