Programowanie w języku Delphi » Artykuły

Jak uzyskać informację o temperaturze chipsetu karty graficznej?

  • 2010-11-07 13:00
  • 0 komentarzy
  • 733 odsłony
  • Oceń ten tekst jako pierwszy

W dzisiejszym odcinku zajmiemy się tak prozaiczną rzeczą jaką jest obsługa karty graficznej. Nie będziemy bynajmniej rysować, ale spróbujemy wyciągnąć jakieś informacje o karcie graficznej. Lud krzyczy "ciepło" więc spróbujemy wyciągnąć temperaturę procesora GPU.

Aby zacząć zabawę musimy ściągnąć plik NvApi.pas. Dla tych co nie umieją korzystać z wyszukiwarek dołączam link: http://andy.jgknet.de/blog/?page_id=351

Tworzymy nowy projekt i dołączmy plik NvApi.pas do projektu.

Inicjalizacja



Aby zacząć przygodę z kartą kraficzną NVidia należy zainicjalizować bibliotekę.

Robi się to tak:
var
  status: NvAPI_Status;
  errormsg: NvAPI_ShortString;
begin
  status:= NvAPI_Initialize();
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_Initialize: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
end;


Sli nie Sli



Teraz dowiemy się ile mamy urządzeń wyświetlania NVidia:

var
  hDisplay_a: array[0..NVAPI_MAX_PHYSICAL_GPUS * 2] of PNvDisplayHandle;
  i: Integer;
begin
  i:= 0;
  status := NvAPI_EnumNvidiaDisplayHandle(i, @hDisplay_a[i]);
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_EnumNvidiaDisplayHandle: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
end;


Temperatura karty graficznej



Jaka jest temperatura procesora GPU karty graficznej:

var
  thermalset: NV_GPU_THERMAL_SETTINGS;
  nvGPUHandle: TNvPhysicalGpuHandleArray;
  cnt: Cardinal;
begin
  status := NvAPI_GetPhysicalGPUsFromDisplay(hDisplay_a[i], nvGPUHandle, cnt);
  begin
    thermalset.version := NV_GPU_THERMAL_SETTINGS_VER;
    thermalset.count := 0;
    thermalset.sensor[0].controller := NVAPI_THERMAL_CONTROLLER_UNKNOWN;
    thermalset.sensor[0].target := NVAPI_THERMAL_TARGET_GPU;
    status := NvAPI_GPU_GetThermalSettings(nvGPUHandle[i], 0 , @thermalset);
    if status <> NVAPI_OK then
    begin
      NvAPI_GetErrorMessage(status, errormsg);
      MessageBox(0, PChar('NVAPI NvAPI_GPU_GetThermalSettings: ' + errormsg), 'Błąd', 0);
      Exit;
    end;
    LTemp.Caption:= IntToStr(thermalset.sensor[0].currentTemp); //tu wyśiwtlamy temperaturę GPU
  end;
end;


Cały projekt:



unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NvAPI, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    LTemp: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  status: NvAPI_Status;
  errormsg: NvAPI_ShortString;
  thermalset: NV_GPU_THERMAL_SETTINGS;
  nvGPUHandle: TNvPhysicalGpuHandleArray;
  hDisplay_a: array[0..NVAPI_MAX_PHYSICAL_GPUS * 2] of PNvDisplayHandle;
  i: Integer;
  cnt: Cardinal;
begin
  status:= NvAPI_Initialize();
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_Initialize: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
 
  i:= 0;
  status := NvAPI_EnumNvidiaDisplayHandle(i, @hDisplay_a[i]);
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_EnumNvidiaDisplayHandle: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
 
  status := NvAPI_GetPhysicalGPUsFromDisplay(hDisplay_a[i], nvGPUHandle, cnt);
  begin
    thermalset.version := NV_GPU_THERMAL_SETTINGS_VER;
    thermalset.count := 0;
    thermalset.sensor[0].controller := NVAPI_THERMAL_CONTROLLER_UNKNOWN;
    thermalset.sensor[0].target := NVAPI_THERMAL_TARGET_GPU;
    status := NvAPI_GPU_GetThermalSettings(nvGPUHandle[i], 0 , @thermalset);
    if status <> NVAPI_OK then
    begin
      NvAPI_GetErrorMessage(status, errormsg);
      MessageBox(0, PChar('NVAPI NvAPI_GPU_GetThermalSettings: ' + errormsg), 'Błąd', 0);
      Exit;
    end;
    LTemp.Caption:= IntToStr(thermalset.sensor[0].currentTemp); //wyświetlamy temperaturę GPU
  end;
 
end;
 
end.


Warto przejrzeć plik nagłówkowy NvApi.pas, w którym np. możemy znaleźć taką funkcję jak NvAPI_GPU_GetFullName która zwróci nam pełną nazwę karty graficznej.