Laden...

Grafikarten-Temperatur auslesen: Failed to read temperature

Erstellt von Idontneedaname vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.760 Views
I
Idontneedaname Themenstarter:in
5 Beiträge seit 2012
vor 12 Jahren
Grafikarten-Temperatur auslesen: Failed to read temperature

Altes Problem: Ich möchte die Temperatur meine Nvidia auslesen.
Ich habe jetzt die letzten zwei Tage schon das Internet durchforstet, und bin eigentlich immer auf die selbe Lösung gestoßen (auch auf die Threads, die es in diesem Forum schon gibt):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Sidebar
{
    public class NvidiaData
    {
        int kern, außen, max;

        private class NativeMethod
        {
            [DllImport("nvcpl.dll", EntryPoint = "NvCplGetThermalSettings", CallingConvention=CallingConvention.Cdecl)]
            public static extern bool NvCplGetThermalSettings(int nWindowsMonitor, ref int pdwCoreTemp, ref int pdwAmbientTemp, ref int pdwUpperLimit);
        }

        public void getTemperature()
        {
            if (NativeMethod.NvCplGetThermalSettings(0, ref kern, ref außen, ref max))
            {
                Console.Write(kern + " " + außen);
            }
            Console.Write("Failed to read temperature.\n");
        }
    }
}

Dll importieren und auslesen. Soweit, so gut. Es kompiliert auch. Allerdings gibt das Programm immer die Konsolenbenachrichtigung "Failed to read temperature" aus.

Habe ich etwas übersehen? Oder genauer gesagt/gefragt: Was muss ich ändern, um die Temperatur zurückgegeben zu bekommen?

C
2.122 Beiträge seit 2010
vor 12 Jahren

Also dass es das immer ausgibt ist ja nicht so komisch oder? Du hast das ja ausdrücklich so programmiert.
Ansonsten müsstest du mal schauen ob du zu der nativen Funktion was findest, was die genau zurück gibt und was passiert sein könnte wenn sie false zurückgibt.
Ich könnt mir vorstellen dass das eine Funktion ist, die bei Erfolg 0 (also false) zurück gibt und bei einem Fehler irgendwas ungleich 0. Guck das mal nach.

Gib doch einfach die 3 Parameter mal ohne if aus und schau was da drin steht.

I
Idontneedaname Themenstarter:in
5 Beiträge seit 2012
vor 12 Jahren

Tatsache, das mit dem else is der Umstrukturierung zum opfer gefallen. Danke dafür!

Die drei Parameter sind nach dem Aufruf 0, 0 und 0.

EDIT: Utilities And APIs: NVCPL.DLL API Manual (PDF-Dokument) - das hier sagt dass es true bei success zurückgibt (Seite 64).

C
2.122 Beiträge seit 2010
vor 12 Jahren

Vielleicht liegt es dran dass der BOOL in C eine andere Größe hat als in C#? Bin mir da aber grad nicht sicher.
Versuch mal einen int zurückzugeben und schau dir den an. Komisch ist natürlich dass die Werte alle 0 sind.

Wärs denkbar dass deine Grafikkarte das ganz einfach nicht unterstützt?

I
Idontneedaname Themenstarter:in
5 Beiträge seit 2012
vor 12 Jahren

Gleiches Ergebnis mit Int. Ich hab ne Nvidia GTX 460, die sollte das können.

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Idontneedaname,

du bist jedenfalls nicht alleine mit dem Problem:
GPU Temperatur auslesen [==> PInvokeStackImbalance]

Auch bei mir returnt der Aufruf immer false; bei mir werkelt ebenfalls eine GTX 460.

Vielleicht hilft dir aber: GPU Observer – Sidebar Gadget (das funktioniert bei mir - und so etwas scheinst du ja bauen zu wollen)

L
667 Beiträge seit 2004
vor 12 Jahren

Vielleicht liegt es dran dass der BOOL in C eine andere Größe hat als in C#? [...] Versuch mal einen int zurückzugeben [...]

Wenn es C ist nutzt ein Int nichts, dann müsste man stattdessen schon MarshalAs(UnmanagedType.I2) verwenden.

"It is not wise to be wise" - Sun Tzu