环境: window7 64位 cpu Intel i3-4170

一、程序运行如下:

i3-4170是双核四线程。我暂时没有找出区分线程数跟核心数的区别。这个问题以后再去解决吧

二、编程前准备 ( 可以直接跳到三、 处,源码中已经有了)
获得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

四、源码介绍

先来看看主函数部分(readPcInfo.cpp)
好吧主函数基本什么都没有,还是跳过吧。

#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();    //调用对象函数,读取cpu温度//cout << myCpu.cpuTemp[0] << endl;myCpu.SysTimeDisplay(); //显示系统时间myCpu.CpuTempDisplay();  //显示cpu温度Sleep(1000);system("cls");}return 0;
}

运用WinRing0获得cpu温度部分:
1.ReadCpuInfo.h
主要就是加载了WinRing0.lib,函数1和函数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;              //获得的线程数int Tjmax;
public:ReadCpuInfo();            virtual ~ReadCpuInfo();
public://void ReadCpuTempInit();void ReadCpuTemp();        //函数2void CpuTempDisplay();void SysTimeDisplay();void clearRecordFile();
private:void ReadCpuInfoInit();   //函数1void ReadCpuInfoExit();void RecordCpuInfo(char *buf);int CheckAndPrint(char message[], BOOL flag);
};

2.ReadCpuInfo.cpp 函数实现

#include "stdafx.h"
#include "ReadCpuInfo.h"
#include <string.h>ReadCpuInfo::ReadCpuInfo()
{ReadCpuInfoInit();      //构造函数初始化dllstrcpy_s(fileName, "CpuInfoRecord.txt");
}ReadCpuInfo::~ReadCpuInfo()
{ReadCpuInfoExit();
}void ReadCpuInfo::ReadCpuTemp()      //主要函数
{for (size_t i = 0; i < coreNumber; i++) //遍历CPU{int mask =  0x01 << i;         SetProcessAffinityMask(GetCurrentProcess(), mask);//设置当前使用线程(CPU)DWORD eax, ebx, ecx, edx;Rdmsr(0x19c, &eax, &edx);    //读取温度寄存器(eax&0x7f0000可以获得温度数据)cpuTemp[i] = Tjmax - ((eax & 0x7f0000) >> 16);//实际温度= Tjmax - 温度数据}}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;  //获得线程数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结构体一样的效果   //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

vs2013 获取cpu温度相关推荐

  1. RK3588 实现温控风扇之获取cpu温度(一)

    RK3588 实现温控风扇系列文章 第一章: RK3588 实现温控风扇之如何获取cpu温度(一) 第二章: RK3588 实现温控风扇之pwm驱动调试(二) 第三章: RK3588 实现温控风扇之通 ...

  2. windows用c++获取cpu温度

    很抱歉,获取 CPU 温度并不是一件简单的事情,因为 Windows 操作系统本身不提供直接获取 CPU 温度的 API.你可以使用第三方软件来读取 CPU 温度信息,然后通过 Windows API ...

  3. Linux系统获取CPU温度

    Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...

  4. C# 获取CPU 温度 的两种方式

    上次接手了一个需要对服务器的检测系统软件,但是在获取CPU温度的时候总是出问题,查找了很多的资料,总结了以下两种方法,是比较常见的 //第一种方法 就是传统的 wimi 方式获取 ,需要引进一个命名空 ...

  5. 关于获取CPU温度的CSDN帖子

    关于获取CPU温度的CSDN帖子 (2008-02-19 13:27:28) 1:各位高手,回句话啊!!cpu的温度放在那里了!!有谁知道!! bios里面那个对么??可以通过读bios来得到cpu的 ...

  6. 使用python获取cpu温度

    import clr import time #获取cpu温度 clr.AddReference(r'D:\temp\OpenHardwareMonitor\OpenHardwareMonitorLi ...

  7. BMC通过PECI接口获取CPU温度实现方法

    本文转载于网络,侵权删. PECI是用于监测CPU及芯片组温度的一线总线(one-wirebus),全称是Platform Environment Control Interface.它最主要的应用是 ...

  8. python获取cpu温度_如何获得树莓派CPU实时温度值

    [前言] 任何的电子设备在工作过程中必定会产生发热的现象,而不控制好设备的温度的话,很有可能会损坏设备,或者照成设备的性能下降,本文将通过学习如何读取树莓派CPU温度值,方便后期对树莓派做一些相应的控 ...

  9. Python在Linux下获取CPU温度、使用率、内存使用率、硬盘使用率

    方法一: psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于 ...

最新文章

  1. 一文详析微信和淘宝扫码登录背后的实现原理!
  2. 线性代数可以速成吗_广播/学习吉他速成靠谱吗?真的可以速成吗?
  3. easyui、表格中添加操作一列,将操作下设置为修改,点击修改弹出该行对象的编号。
  4. python类实例化_python基础8之类的实例化过程剖析
  5. (77)译码器与编码器(八三编码器)
  6. 【机器学习】集成学习(Ensemble Learning)介绍
  7. Spring Cache使用详解
  8. Poj(2225),三维BFS
  9. error C2065: 'assert' : undeclared identifier
  10. 基于STM32F407_温度传感器DS18B20的TFT显示屏实时显示温度
  11. 天津滨海农商银行数据脱敏建设实践
  12. 数据挖掘(数据分析)从业指南
  13. fastjson 首字母大写问题
  14. 数据库面试题——索引(一)
  15. android中的ssl_Android中的SSL固定
  16. pyqt 服务器mysql_PyQt5 中调用MySql接口失败 ( QSqlDatabase 组件) 在Linux环境下如何修改...
  17. matlab电流可逆斩波电路,电流可逆斩波电路.PPT
  18. (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  19. 企业如何选择合适的SaaS软件?
  20. elasticsearch查询错误

热门文章

  1. 行政区划sql数据脚本
  2. 孔板流量计与均速管流量计的比较
  3. 地图着色问题javaScript版-- 《算法分析与设计》课程设计题目
  4. 【多态 多态 多态】
  5. 让eclipse的主题变成黑色
  6. GIS篇—搭建本地地图服务器(geoserver )和 leaflet 绘制多边形,点击事件等
  7. 论文阅读2018-Deep Convolutional Neural Networks for breast cancer screening 重点:利用迁移学习三个网络常规化进行分类
  8. 【知识兔最牛Excel教程】PPT与Excel中图、表链接起来,自动更新
  9. 我和 HelloGitHub
  10. 托管代码C#调用非托管C++ API, 封送嵌套结构体数组