日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vs2013 获取cpu温度

發(fā)布時間:2024/3/24 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs2013 获取cpu温度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

環(huán)境: window7 64位 cpu Intel i3-4170

一、程序運行如下:

i3-4170是雙核四線程。我暫時沒有找出區(qū)分線程數(shù)跟核心數(shù)的區(qū)別。這個問題以后再去解決吧

二、編程前準(zhǔn)備 ( 可以直接跳到三、 處,源碼中已經(jīng)有了)
獲得cpu溫度的方法是讀取cpu寄存器。由于windows的保護機制,無法直接使用匯編程序讀取寄存器,因此使用了WinRing0庫。
下載鏈接如下:
http://download.csdn.net/detail/xiufeng_wang/1140396
需要用到的文件如下:
WinRing0.dll
WinRing0.sys
WinRing0x64.dll
WinRing0x64.sys
WinRing0.lib
OlsApi.h

其中WinRing0.lib、OlsApi.h放在編譯文件處,其他的需要放在.exe文件夾下。

三、源碼如下:
http://download.csdn.net/detail/jiaowosongsong/9496571

四、源碼介紹

先來看看主函數(shù)部分(readPcInfo.cpp)
好吧主函數(shù)基本什么都沒有,還是跳過吧。

#include "stdafx.h" #include "ReadCpuInfo.h" //#include "OlsApi.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) {ReadCpuInfo myCpu; //生成對象//cout << InitializeOls() << endl;;//cout << sysInfo.dwNumberOfProcessors << endl;//cout << sysInfo.dwActiveProcessorMask << endl;while (1){myCpu.ReadCpuTemp(); //調(diào)用對象函數(shù),讀取cpu溫度//cout << myCpu.cpuTemp[0] << endl;myCpu.SysTimeDisplay(); //顯示系統(tǒng)時間myCpu.CpuTempDisplay(); //顯示cpu溫度Sleep(1000);system("cls");}return 0; }

運用WinRing0獲得cpu溫度部分:
1.ReadCpuInfo.h
主要就是加載了WinRing0.lib,函數(shù)1和函數(shù)2 完成了整個流程;

#pragma once #include<windows.h> #include "OlsApi.h" //頭文件 #pragma comment (lib,"WinRing0.lib") //加載lib #define CONSOLE_PRINT 1 class ReadCpuInfo { private:char fileName[30]; public:int cpuTemp[8];int coreNumber; //獲得的線程數(shù)int Tjmax; public:ReadCpuInfo(); virtual ~ReadCpuInfo(); public://void ReadCpuTempInit();void ReadCpuTemp(); //函數(shù)2void CpuTempDisplay();void SysTimeDisplay();void clearRecordFile(); private:void ReadCpuInfoInit(); //函數(shù)1void ReadCpuInfoExit();void RecordCpuInfo(char *buf);int CheckAndPrint(char message[], BOOL flag); };

2.ReadCpuInfo.cpp 函數(shù)實現(xiàn)

#include "stdafx.h" #include "ReadCpuInfo.h" #include <string.h>ReadCpuInfo::ReadCpuInfo() {ReadCpuInfoInit(); //構(gòu)造函數(shù)初始化dllstrcpy_s(fileName, "CpuInfoRecord.txt"); }ReadCpuInfo::~ReadCpuInfo() {ReadCpuInfoExit(); }void ReadCpuInfo::ReadCpuTemp() //主要函數(shù) {for (size_t i = 0; i < coreNumber; i++) //遍歷CPU{int mask = 0x01 << i; SetProcessAffinityMask(GetCurrentProcess(), mask);//設(shè)置當(dāng)前使用線程(CPU)DWORD eax, ebx, ecx, edx;Rdmsr(0x19c, &eax, &edx); //讀取溫度寄存器(eax&0x7f0000可以獲得溫度數(shù)據(jù))cpuTemp[i] = Tjmax - ((eax & 0x7f0000) >> 16);//實際溫度= Tjmax - 溫度數(shù)據(jù)}}void ReadCpuInfo::ReadCpuInfoInit() //初始化 {if (true == CheckAndPrint("Init DLL function", InitializeOls())) //dll的初始化{if (true == CheckAndPrint("IsCpuid function", IsCpuid())) //判斷是否支持Cpuid{if (true == CheckAndPrint("Ismsr function", IsMsr())) //是否支持Rdmsr{DWORD eax, ebx, ecx, edx;Rdmsr(0x1A2, &eax, &edx); //讀取寄存器Tjmax = (eax & 0xff0000) >> 16; //獲得Tjmax//printf("%d\n", Tjmax); //show max temperatureSYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo);coreNumber = sysInfo.dwNumberOfProcessors; //獲得線程數(shù)SetProcessAffinityMask(GetCurrentProcess(), 1); //切換到第一個cpu;}}} }void ReadCpuInfo::ReadCpuInfoExit() {DeinitializeOls(); } int ReadCpuInfo::CheckAndPrint(char message[], BOOL flag) {if (flag){printf("%s is checked Enable!\n", message);return 1;}else{printf("%s is checked unEnabled!\n", message);return 0;} }void ReadCpuInfo::CpuTempDisplay() {for (size_t i = 0; i < coreNumber; i++){char buf[1024] = ""; #if (CONSOLE_PRINT)printf("Core #%d: %dC\n", i, cpuTemp[i]); #else #endifsprintf_s(buf, "Core #%d: %dC\n", i, cpuTemp[i]);RecordCpuInfo(buf);} } void ReadCpuInfo::SysTimeDisplay() {clearRecordFile();SYSTEMTIME start; //windows.h中 GetLocalTime(&start);//time.h的tm結(jié)構(gòu)體一樣的效果 //printf("%d\n", start.wHour); #if (CONSOLE_PRINT)printf("date: %02d/%02d/%02d\n",start.wYear, start.wMonth, start.wDay);printf("time: %02d:%02d:%02d\n",start.wHour, start.wMinute, start.wSecond); #else #endifchar buf[1024] = "";sprintf_s(buf, "date: %02d/%02d/%02d\n", start.wYear, start.wMonth, start.wDay);RecordCpuInfo(buf);memset(buf, 0, sizeof(buf));sprintf_s(buf, "time: %02d:%02d:%02d\n",start.wHour, start.wMinute, start.wSecond);RecordCpuInfo(buf);}void ReadCpuInfo::RecordCpuInfo(char *buf) {FILE *fp;fopen_s(&fp,fileName, "a+");if (fp == NULL){printf("file open error!\n");return;}else{fwrite(buf, strlen(buf), 1, fp);}fclose(fp);}void ReadCpuInfo:: clearRecordFile() {FILE *fp;fopen_s(&fp,fileName, "w+");if (fp == NULL){printf("file open error!\n");return ;}fclose(fp); }

大家看完后估計還是一頭霧水,更詳細的原理可以看看其他博客:
http://blog.csdn.net/zhangweilst/article/details/43857371

http://www.tuicool.com/articles/EF7rii

總結(jié)

以上是生活随笔為你收集整理的vs2013 获取cpu温度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。