Jak uzyskać informację o temperaturze chipsetu karty graficznej?
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.