如题

解决方案 »

  1.   

    使用TeeChart也可以实现,但是没有Abakus VCL专业!!!
      

  2.   

    就是用chart实现的,我用来写了一个测试我们公司系统的图表,可以横向滚动、放缩等功能,如果你需要留个E-MAIL,另外你也可以看DELPHI的例子,比较简单的
      

  3.   

    问题在数据不多的时候,那些点平分了Chart的区间,很难看
    我需要的是不管数据是多是少,曲线都一步一步向左移。
    就是要window任务管理器中CPU使用时间刚开始的那段情况,
    请帮忙,分不够可以再加。
      

  4.   

    给你一个获得CPU使用率的例子
    unit GetCPUUsagePass;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;const
      SystemBasicInformation = 0;
      SystemPerformanceInformation = 2;
      SystemTimeInformation = 3;type
      TPDWord = ^DWORD;  TSystem_Basic_Information = packed record
        dwUnknown1: DWORD;
        uKeMaximumIncrement: ULONG;
        uPageSize: ULONG;
        uMmNumberOfPhysicalPages: ULONG;
        uMmLowestPhysicalPage: ULONG;
        uMmHighestPhysicalPage: ULONG;
        uAllocationGranularity: ULONG;
        pLowestUserAddress: Pointer;
        pMmHighestUserAddress: Pointer;
        uKeActiveProcessors: ULONG;
        bKeNumberProcessors: byte;
        bUnknown2: byte;
        wUnknown3: word;
      end;
      TSystem_Performance_Information = packed record
        liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
        dwSpare: array[0..75] of DWORD;
      end;
      TSystem_Time_Information = packed record
        liKeBootTime: LARGE_INTEGER;
        liKeSystemTime: LARGE_INTEGER;
        liExpTimeZoneBias: LARGE_INTEGER;
        uCurrentTimeZoneId: ULONG;
        dwReserved: DWORD;
      end;
    var
      NtQuerySystemInformation: function(infoClass: DWORD;
          buffer: Pointer;
          bufSize: DWORD;
          returnSize: TPDword): DWORD; stdcall = nil;
      liOldIdleTime: LARGE_INTEGER = ();
      liOldSystemTime: LARGE_INTEGER = ();
    function Li2Double(x: LARGE_INTEGER): Double;
    function GetCPUUsage:String;implementation
    function Li2Double(x: LARGE_INTEGER): Double;
    begin
      Result := x.HighPart * 4.294967296E9 + x.LowPart
    end;function GetCPUUsage:string;
    var
      SysBaseInfo: TSystem_Basic_Information;
      SysPerfInfo: TSystem_Performance_Information;
      SysTimeInfo: TSystem_Time_Information;
      status: Longint; {long}
      dbSystemTime: Double;
      dbIdleTime: Double;
    begin
      Result:= '0 %';
      if @NtQuerySystemInformation = nil then
        NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
          'NtQuerySystemInformation');  status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
      if status <> 0 then Exit;    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), nil);
        if status <> 0 then Exit;
        status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
        if status <> 0 then Exit;
        if (liOldIdleTime.QuadPart <> 0) then
        begin
          dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
          dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
          dbIdleTime := dbIdleTime / dbSystemTime;
          dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5;
          Result := FormatFloat('0 %',dbIdleTime);
          Application.ProcessMessages;
        end;
        liOldIdleTime := SysPerfInfo.liIdleTime;
        liOldSystemTime := SysTimeInfo.liKeSystemTime;
    end;end.