2009-07-28 28 views
47

Tôi cần thu thập một số thông tin của hệ thống cho ứng dụng tôi đang phát triển. Bộ nhớ có sẵn và tải CPU rất dễ sử dụng C#. Thật không may, nhiệt độ CPU nó không phải là dễ dàng. Tôi đã cố gắng sử dụng WMI nhưng tôi không thể có được bất cứ điều gì bằngLàm thế nào để có được nhiệt độ CPU?

Win32_TemperatureProbe 

hoặc

MSAcpi_ThermalZoneTemperature 

Có ai đã giải quyết xong vấn đề này? Tôi đang tự hỏi như thế nào theo dõi chương trình, như SiSoftware Sandra, có thể nhận được thông tin rằng ...

Chỉ trong trường hợp bất cứ ai quan tâm, đây là mã của lớp:

public class SystemInformation 
{ 
    private System.Diagnostics.PerformanceCounter m_memoryCounter; 
    private System.Diagnostics.PerformanceCounter m_CPUCounter; 

    public SystemInformation() 
    { 
     m_memoryCounter = new System.Diagnostics.PerformanceCounter(); 
     m_memoryCounter.CategoryName = "Memory"; 
     m_memoryCounter.CounterName = "Available MBytes"; 

     m_CPUCounter = new System.Diagnostics.PerformanceCounter(); 
     m_CPUCounter.CategoryName = "Processor"; 
     m_CPUCounter.CounterName = "% Processor Time"; 
     m_CPUCounter.InstanceName = "_Total"; 
    } 

    public float GetAvailableMemory() 
    { 
     return m_memoryCounter.NextValue(); 
    } 

    public float GetCPULoad() 
    { 
     return m_CPUCounter.NextValue(); 
    } 

    public float GetCPUTemperature() 
    { 
     //... 
     return 0; 
    } 
} 
+0

Nếu bạn sẵn sàng trả tôi sẽ nhìn vào http://www.cpuid-pro.com nếu tôi nhớ chính xác cùng một thư viện của nó mà 'z-cpu 'use .. – Peter

Trả lời

19

Tôi khá chắc chắn đó là nhà sản xuất phụ thuộc, vì họ sẽ được truy cập thông qua một cổng I/O. Nếu bạn có một bảng cụ thể mà bạn đang cố gắng làm việc, hãy thử xem qua các hướng dẫn sử dụng và/hoặc liên hệ với nhà sản xuất.

Nếu bạn muốn làm điều này cho nhiều bảng khác nhau, tôi khuyên bạn nên liên hệ với ai đó tại một cái gì đó như SiSoftware hoặc chuẩn bị để đọc rất nhiều hướng dẫn sử dụng bo mạch chủ.

Lưu ý khác, không phải tất cả các bảng đều có màn hình nhiệt độ.

Bạn cũng có thể gặp sự cố khi truy cập đặc quyền từ hạt nhân.

3

Có một bài đăng trên blog với một số mã mẫu C# về cách thực hiện nó here.

+1

Điều đó vẫn yêu cầu trình điều khiển của nhà cung cấp phải hiển thị nó thông qua WMI. – ewanm89

30

Tôi biết bài đăng này cũ, nhưng chỉ muốn thêm nhận xét nếu ai đó nên xem bài đăng này và cố gắng tìm giải pháp cho vấn đề này.

Bạn thực sự có thể đọc nhiệt độ CPU rất dễ dàng trong C# bằng cách sử dụng cách tiếp cận WMI.

Để nhận giá trị Celsius, tôi đã tạo một trình bao bọc để chuyển đổi giá trị được trả về bởi WMI và kết thúc nó thành một đối tượng dễ sử dụng.

Hãy nhớ thêm tham chiếu đến System.Management.dll trong Visual Studio.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Management; 

namespace RCoding.Common.Diagnostics.SystemInfo 
{ 
    public class Temperature 
    { 
     public double CurrentValue { get; set; } 
     public string InstanceName { get; set; } 
     public static List<Temperature> Temperatures 
     { 
      get 
      { 
       List<Temperature> result = new List<Temperature>(); 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature"); 
       foreach (ManagementObject obj in searcher.Get()) 
       { 
        Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString()); 
        temp = (temp - 2732)/10.0; 
        result.Add(new Temperature { CurrentValue = temp, InstanceName = obj["InstanceName"].ToString() }); 
       } 
       return result; 

      } 
     } 
    } 
} 

Cập nhật 2010/06/25:

(Chỉ cần thấy một liên kết được đưa lên cùng một loại giải pháp trên ... Dù sao, tôi sẽ để lại đoạn mã này nếu ai đó nên muốn sử dụng nó :-))

+7

Bạn đã đọc câu hỏi chưa? OP cho biết anh ta đã thử MSAcpi_ThermalZoneTemperature ... –

+0

Đây không phải là nhiệt độ CPU, tôi nghĩ nhiệt độ trường hợp của nó. Bạn có thể kiểm tra bằng cách sử dụng CPUID. – zezba9000

47

Đối với người khác có thể đi qua đây, có thể có một cái nhìn tại địa chỉ: http://openhardwaremonitor.org/

theo li rằng nk và lúc đầu bạn có thể nghĩ, "Đây là một ứng dụng, đó là lý do tại sao nó bị loại bỏ, câu hỏi là làm thế nào để làm điều này từ mã C#, không tìm thấy một ứng dụng có thể cho tôi biết nhiệt độ ..." nó cho thấy bạn không sẵn sàng đầu tư đủ thời gian để đọc những gì "Open Hardware Monitor" cũng vậy.

Chúng cũng bao gồm một giao diện dữ liệu, đây là mô tả:

dữ liệu giao diện Open Hardware Monitor công bố tất cả các dữ liệu cảm biến để WMI (Windows Management Instrumentation). Điều này cũng cho phép các ứng dụng khác đọc và sử dụng thông tin cảm biến. A tài liệu sơ bộ về giao diện có thể được tìm thấy here(click).

Khi bạn tải xuống, ứng dụng này có chứa ứng dụng OpenHardwareMonitor.exe, bạn không tìm kiếm ứng dụng đó. Nó cũng chứa OpenHardwareMonitorLib.dll, bạn đang tìm kiếm cái đó.

Chủ yếu, nếu không phải là 100%, chỉ cần một trình bao bọc xung quanh API WinRing0, bạn có thể chọn tự bọc mình nếu bạn cảm thấy thích.

Tôi đã tự mình thử tính năng này từ ứng dụng C# và ứng dụng hoạt động. Mặc dù nó vẫn đang trong giai đoạn thử nghiệm, nó có vẻ khá ổn định. Nó cũng là nguồn mở nên nó có thể là một điểm khởi đầu tốt để thay thế.

Vào cuối ngày, tôi thấy thật khó tin rằng đó không phải là chủ đề của câu hỏi này.

+0

Bạn có thể liên kết bất kỳ tài liệu nào về việc sử dụng OpenHardware Lib không? Tôi dường như không thể tìm ra cách sử dụng nó trong dự án của mình. – CJxD

+0

Unfortunetly không, tôi sử dụng đồng bằng cũ "khám phá" để tìm những thứ tôi cần ... Nhưng những gì bạn có vấn đề với? ... Tại nó rất cơ bản nó là instantiating "Computer" lớp và sau đó chỉ cần làm việc trên đó ... (ví dụHoặc tải xuống nguồn từ kho SVN của họ và cố gắng tìm ra GUI của riêng họ, cá nhân tôi không có vấn đề lớn để khám phá mọi thứ, nhưng nếu thiếu một thứ gì đó cụ thể thì có thể được? – Jens

+0

Và với việc tìm hiểu GUI của họ, tôi có ý nghĩa như một nguồn cảm hứng cho cách bạn truy cập vào các cảm biến khác nhau và vân vân ... Và sau đó nhân rộng sử dụng đó trong dự án của riêng bạn. – Jens

1

Nó có thể được thực hiện trong mã của bạn thông qua WMI. Tôi đã tìm thấy một công cụ từ Microsoft tạo mã cho nó.

Công cụ WMI Mã Creator cho phép bạn tạo ra VBScript, C#, và VB NET mã có sử dụng WMI để hoàn thành một nhiệm vụ quản lý như truy vấn cho dữ liệu quản lý, thực hiện một phương pháp từ một lớp WMI, hoặc nhận được thông báo sự kiện bằng WMI.

Bạn có thể tải xuống số here.

1

Tùy thuộc vào việc máy tính của bạn có hỗ trợ WMI hay không. Máy tính của tôi không thể chạy bản demo WMI này nữa.

Nhưng tôi thành công có được nhiệt độ CPU thông qua Open Hardware Monitor. Thêm tham chiếu Openhardwaremonitor trong Visual Studio. Nó dễ dàng hơn. Hãy thử điều này

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using OpenHardwareMonitor.Hardware; 
namespace Get_CPU_Temp5 
{ 
    class Program 
    { 
     public class UpdateVisitor : IVisitor 
     { 
      public void VisitComputer(IComputer computer) 
      { 
       computer.Traverse(this); 
      } 
      public void VisitHardware(IHardware hardware) 
      { 
       hardware.Update(); 
       foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); 
      } 
      public void VisitSensor(ISensor sensor) { } 
      public void VisitParameter(IParameter parameter) { } 
     } 
     static void GetSystemInfo() 
     { 
      UpdateVisitor updateVisitor = new UpdateVisitor(); 
      Computer computer = new Computer(); 
      computer.Open(); 
      computer.CPUEnabled = true; 
      computer.Accept(updateVisitor); 
      for (int i = 0; i < computer.Hardware.Length; i++) 
      { 
       if (computer.Hardware[i].HardwareType == HardwareType.CPU) 
       { 
        for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) 
        { 
         if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature) 
           Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r"); 
        } 
       } 
      } 
      computer.Close(); 
     } 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       GetSystemInfo(); 
      } 
     } 
    } 
} 

Bạn cần chạy demo này làm quản trị viên.

Bạn có thể xem hướng dẫn ở đây: http://www.lattepanda.com/topic-f11t3004.html

Các vấn đề liên quan