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