研究了一下
cpu温度的数值由主板驱动供给windows,目前的现状是许多PC兼容机不提供或没安装“专用的主板驱动”(比如大量的ghost集成装机),连win都没法获知温度,更别提win之上的Java。
在专用主板驱动安装正常的win-java系统下可以:
import javautilScanner;
public class Test {
static public void main(String 土数[]) {
try {
final String cmd="wmic /namespace:\\\\root\\WMI path MSAcpi_ThermalZoneTemperature get CurrentTemperature";
Process p = RuntimegetRuntime()exec(cmd);
pgetOutputStream()close();//这句不写就不执行
Scanner sc=new Scanner(pgetInputStream());
scnext();
float t=(scnextInt()-2732f)/10f;
scclose();
Systemoutprintln("当前CPU温度:"+t);
pwaitFor();
} catch (Exception e) {
eprintStackTrace();
}
}
}
==
当前CPU温度:410
linux下同样依赖“主板驱动”, 数据提供给/dev/sensor
// “获得Intel CPU ID”按钮消息处理函数
void CIntelCPUIDDlg::OnBtnCPUID()
{
unsigned long s1,s2;
unsigned char vendor_id[]="------------";//CPU提供商ID
CString str1,str2,str3;
// 以下为获得CPU ID的汇编语言指令
_asm // 得到CPU提供商信息
{
xor eax,eax // 将eax清0
cpuid // 获取CPUID的指令
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
str1Format("%s",vendor_id);
_asm // 得到CPU ID的高32位
{
mov eax,01h
xor edx,edx
cpuid
mov s2,eax
}
str2Format("%08X-",s2);
_asm // 得到CPU ID的低64位
{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
str3Format("%08X-%08X\n",s1,s2);
str2=str2+str3;
m_editVendorSetWindowText(str1);
m_editCPUIDSetWindowText(str2);
}
// GetHDSerialcpp: implementation of the CGetHDSerial class
//
//////////////////////////////////////////////////////////////////////
#include "stdafxh"
#include "GetHDSerialh"
char m_buffer[256];
WORD m_serial[256];
DWORD m_OldInterruptAddress;
DWORDLONG m_IDTR;
// 等待硬盘空闲
static unsigned int WaitHardDiskIdle()
{
BYTE byTemp;
Waiting:
_asm
{
mov dx, 0x1f7
in al, dx
cmp al, 0x80
jb Endwaiting
jmp Waiting
}
Endwaiting:
_asm
{
mov byTemp, al
}
return byTemp;
}
//中断服务程序
void _declspec( naked )InterruptProcess(void)
{
int byTemp;
int i;
WORD temp;
//保存寄存器值
_asm
{
push eax
push ebx
push ecx
push edx
push esi
}
WaitHardDiskIdle();//等待硬盘空闲状态
_asm
{
mov dx, 0x1f6
mov al, 0xa0
out dx, al
}
byTemp = WaitHardDiskIdle(); //若直接在Ring3级执行等待命令,会进入死循环
if ((byTemp&0x50)!=0x50)
{
_asm // 恢复中断现场并退出中断服务程序
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
_asm
{
mov dx, 0x1f6 //命令端口1f6,选择驱动器0
mov al, 0xa0
out dx, al
inc dx
mov al, 0xec
out dx, al //发送读驱动器参数命令
}
byTemp = WaitHardDiskIdle();
if ((byTemp&0x58)!=0x58)
{
_asm // 恢复中断现场并退出中断服务程序
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
//读取硬盘控制器的全部信息
for (i=0;i<256;i++)
{
_asm
{
mov dx, 0x1f0
in ax, dx
mov temp, ax
}
m_serial[i] = temp;
}
_asm
{
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGetHDSerial::CGetHDSerial()
{
}
CGetHDSerial::~CGetHDSerial()
{
}
// 读取硬盘序列号函数
char CGetHDSerial::GetHDSerial()
{
m_buffer[0]='\n';
// 得到当前 *** 作系统版本
OSVERSIONINFO OSVersionInfo;
OSVersionInfodwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &OSVersionInfo);
if (OSVersionInfodwPlatformId != VER_PLATFORM_WIN32_NT)
{
// Windows 9x/ME下读取硬盘序列号
WORD m_wWin9xHDSerial[256];
Win9xReadHDSerial(m_wWin9xHDSerial);
strcpy (m_buffer, WORDToChar (m_wWin9xHDSerial, 10, 19));
}
else
{
// Windows NT/2000/XP下读取硬盘序列号
DWORD m_wWinNTHDSerial[256];
// 判断是否有SCSI硬盘
if ( ! WinNTReadIDEHDSerial(m_wWinNTHDSerial))
WinNTReadSCSIHDSerial(m_wWinNTHDSerial);
strcpy (m_buffer, DWORDToChar (m_wWinNTHDSerial, 10, 19));
}
return m_buffer;
}
// Windows9X/ME系统下读取硬盘序列号
void _stdcall CGetHDSerial::Win9xReadHDSerial(WORD buffer)
{
int i;
for(i=0;i<256;i++)
buffer[i]=0;
_asm
{
push eax
//获取修改的中断的中断描述符(中断门)地址
sidt m_IDTR
mov eax,dword ptr [m_IDTR+02h]
add eax,308h+04h
cli
//保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr m_OldInterruptAddress,ecx
pop ecx
//设置修改的中断入口地址为新的中断处理程序入口地址
push ebx
lea ebx,InterruptProcess
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
//执行中断,转到Ring 0(类似CIH病毒原理)
int 3h
//恢复原先的中断入口地址
push ecx
mov ecx,dword ptr m_OldInterruptAddress
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
sti
pop eax
}
for(i=0;i<256;i++)
buffer[i]=m_serial[i];
}
// Windows 9x/ME系统下,将字类型(WORD)的硬盘信息转换为字符类型(char)
char CGetHDSerial::WORDToChar (WORD diskdata [256], int firstIndex, int lastIndex)
{
static char string [1024];
int index = 0;
int position = 0;
// 按照高字节在前,低字节在后的顺序将字数组diskdata 中内容存入到字符串string中
for (index = firstIndex; index <= lastIndex; index++)
{
// 存入字中的高字节
string [position] = (char) (diskdata [index] / 256);
position++;
// 存入字中的低字节
string [position] = (char) (diskdata [index] % 256);
position++;
}
// 添加字符串结束标志
string [position] = '\0';
// 删除字符串中空格
for (index = position - 1; index > 0 && ' ' == string [index]; index--)
string [index] = '\0';
return string;
}
// Windows NT/2000/XP系统下,将双字类型(DWORD)的硬盘信息转换为字符类型(char)
char CGetHDSerial::DWORDToChar (DWORD diskdata [256], int firstIndex, int lastIndex)
{
static char string [1024];
int index = 0;
int position = 0;
// 按照高字节在前,低字节在后的顺序将双字中的低字存入到字符串string中
for (index = firstIndex; index <= lastIndex; index++)
{
// 存入低字中的高字节
string [position] = (char) (diskdata [index] / 256);
position++;
// 存入低字中的低字节
string [position] = (char) (diskdata [index] % 256);
position++;
}
// 添加字符串结束标志
string [position] = '\0';
// 删除字符串中空格
for (index = position - 1; index > 0 && ' ' == string [index]; index--)
string [index] = '\0';
return string;
}
// Windows NT/2000/XP下读取IDE硬盘序列号
BOOL CGetHDSerial::WinNTReadIDEHDSerial(DWORD buffer)
{
BYTE IdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
BOOL bFlag = FALSE;
int drive = 0;
char driveName [256];
HANDLE hPhysicalDriveIOCTL = 0;
sprintf (driveName, "\\\\\\PhysicalDrive%d", drive);
// Windows NT/2000/XP下创建文件需要管理员权限
hPhysicalDriveIOCTL = CreateFile (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned = 0;
// 得到驱动器的IO控制器版本
memset ((void) &VersionParams, 0, sizeof(VersionParams));
if(DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_VERSION,
NULL, 0, &VersionParams,
sizeof(VersionParams),
&cbBytesReturned, NULL) )
{
if (VersionParamsbIDEDeviceMap > 0)
{
BYTE bIDCmd = 0; // IDE或者ATAPI识别命令
SENDCMDINPARAMS scip;
// 如果驱动器是光驱,采用命令IDE_ATAPI_IDENTIFY, command,
// 否则采用命令IDE_ATA_IDENTIFY读取驱动器信息
bIDCmd = (VersionParamsbIDEDeviceMap >> drive & 0x10)
IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset (&scip, 0, sizeof(scip));
memset (IdOutCmd, 0, sizeof(IdOutCmd));
// 获取驱动器信息
if (WinNTGetIDEHDInfo (hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&IdOutCmd,
(BYTE) bIDCmd,
(BYTE) drive,
&cbBytesReturned))
{
int m = 0;
USHORT pIdSector = (USHORT )
((PSENDCMDOUTPARAMS) IdOutCmd) -> bBuffer;
for (m = 0; m < 256; m++)
buffer[m] = pIdSector [m];
bFlag = TRUE; // 读取硬盘信息成功
}
}
}
CloseHandle (hPhysicalDriveIOCTL); // 关闭句柄
}
return bFlag;
}
// WindowsNT/2000/XP系统下读取SCSI硬盘序列号
BOOL CGetHDSerial::WinNTReadSCSIHDSerial (DWORD buffer)
{
buffer[0]='\n';
int controller = 0;
HANDLE hScsiDriveIOCTL = 0;
char driveName [256];
sprintf (driveName, "\\\\\\Scsi%d:", controller);
// Windows NT/2000/XP下任何权限都可以进行
hScsiDriveIOCTL = CreateFile (driveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
{
int drive = 0;
DWORD dummy;
for (drive = 0; drive < 2; drive++)
{
char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
SRB_IO_CONTROL p = (SRB_IO_CONTROL ) buffer;
SENDCMDINPARAMS pin =
(SENDCMDINPARAMS ) (buffer + sizeof (SRB_IO_CONTROL));
// 准备参数
memset (buffer, 0, sizeof (buffer));
p -> HeaderLength = sizeof (SRB_IO_CONTROL);
p -> Timeout = 10000;
p -> Length = SENDIDLENGTH;
p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy ((char ) p -> Signature, "SCSIDISK", 8);
pin -> irDriveRegsbCommandReg = IDE_ATA_IDENTIFY;
pin -> bDriveNumber = drive;
// 得到SCSI硬盘信息
if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
buffer,
sizeof (SRB_IO_CONTROL) +
sizeof (SENDCMDINPARAMS) - 1,
buffer,
sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
&dummy, NULL))
{
SENDCMDOUTPARAMS pOut =
(SENDCMDOUTPARAMS ) (buffer + sizeof (SRB_IO_CONTROL));
IDSECTOR pId = (IDSECTOR ) (pOut -> bBuffer);
if (pId -> sModelNumber [0])
{
int n = 0;
USHORT pIdSector = (USHORT ) pId;
for (n = 0; n < 256; n++)
buffer[n] =pIdSector [n];
return TRUE; // 读取成功
}
}
}
CloseHandle (hScsiDriveIOCTL); // 关闭句柄
}
return FALSE; // 读取失败
}
// Windows NT/2000/XP下读取IDE设备信息
BOOL CGetHDSerial::WinNTGetIDEHDInfo (HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
PDWORD lpcbBytesReturned)
{
// 为读取设备信息准备参数
pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
pSCIP -> irDriveRegsbFeaturesReg = 0;
pSCIP -> irDriveRegsbSectorCountReg = 1;
pSCIP -> irDriveRegsbSectorNumberReg = 1;
pSCIP -> irDriveRegsbCylLowReg = 0;
pSCIP -> irDriveRegsbCylHighReg = 0;
// 计算驱动器位置
pSCIP -> irDriveRegsbDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);
// 设置读取命令
pSCIP -> irDriveRegsbCommandReg = bIDCmd;
pSCIP -> bDriveNumber = bDriveNum;
pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
// 读取驱动器信息
return ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_GET_DRIVE_INFO,
(LPVOID) pSCIP,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID) pSCOP,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
lpcbBytesReturned, NULL) );
}
主板驱动或者BIOS驱动都会改变CPU,看看主频是否降低了,或者是倍频。想提高的话,可以超频,调高主频、倍频、同时微小的增加CPU电压。不过一般倍频都是锁定的。前提是有支持超频的主板。
1CPU-Z
CPU-Z是一款家喻户晓的CPU检测软件,是检测CPU使用程度最高的一款软件,除了使用Intel或AMD自己的检测软件之外,我们平时使用最多的此类软件就数它了。它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。
对于CPU的鉴别我们还是最好使用原厂软件。使用这个软件可以查看CPU的信息。软件使用十分简单,下载后直接点击文件,就可以看到CPU 名称、厂商、内核进程、内部和外部时钟、局部时钟监测等参数。选购之前或者购买CPU后,如果我们要准确地判断其超频性能,就可以通过它来测量CPU实际设计的FSB频率和倍频。如图所示
需要注意的是,CPU-Z分为32位版本和64位版本,记得根据自己的系统来下载。
2HWiNFO32
HWiNFO32 是一个专业的系统信息工具,支持最新的技术和标准。允许你检查你的计算机的全部硬件。它主要可以显示出处理器、主板及芯片组、PCMCIA接口、BIOS版本、内存等信息,另外HWiNFO还提供了对处理器、内存、硬盘(WIN9X里不可用)以及CD-ROM的性能测试功能。在系统软硬件信息检测方面,EVEREST是当仁不让的No1,不过有特色的此类工具也不少,比如HWiNFO32就是一款老牌软件,同样能让你对系统进行一次大检查,识别信息的同时还提供报告创建、基准检测、传感器状态等工具。
功能 以树形分层显示所有的硬件组件 以带有实时时钟监控的概要形式显示最重要的计算机参数 显示硬件监控状态 做基准测试 创建多种类型的日志文件本程序会定期更新,以支持最新的元件。
这个软件有个很好的地方,就是可以分别看到四个核心的实时频率。如图所示。还有关于CPU的一系列信息以及其它硬件的相关信息。
3CineBench
CineBench也是很有说服力的一套CPU和显卡测试系统,最新的是R15版。CINEBENCH R115支持Windows XP和Vista的X86/X64系统,以及PowerPC和Intel架构Mac平台,最高支持16个处理器核心!相比R115版本的最多16个核心来说,R15版本最多能够支持256个逻辑核心,此外新版本还加强了着色器、抗锯齿、阴影、灯光以及反射模糊等的考察,对CPU性能的检测更加准确。
CineBench R15版本的最终成绩发生了改变,最终的单位为cb,而非R115版本的pts。CineBench使用针对**电视行业开发的Cinema 4D特效软件引擎,可以测试CPU和显卡的性能。测试包括两项,分别针对处理器和显卡的性能指标。第一项测试纯粹使用CPU渲染一张高精度的3D场景画面,在单处理器单线程下只运行一次,如果系统有多个处理器核心或支持多线程,则第一次只使用一个线程,第二次运行使用全部处理器核心和线程。第二项测试则针对显卡的OpenGL性能,如图所示。
4国际象棋
笔记本吧专用国际象棋,如图。
5 ThrottleStop
这是一款可以阻止你CPU在高温时降频或者停止睿频情况的发生。不过针对某些主板限制温度墙降频的不好使。
以上就是几款电脑CPU最常见的检测工具,其中CPU-Z类似智能手机的安兔兔,是CPU测试中,用的最多的一款工具。
在这个情况下,我无法直接查看您的电脑配置信息,因此无法确认您的电脑是否支持至强系列E3 V5 V6的CPU。要判断您的电脑是否支持这些CPU,建议您查看以下信息:
主板型号:检查您的主板型号,然后查找该型号的官方规格说明。这些说明通常会详细列出支持的CPU类型和型号。如果您的主板支持至强系列E3 V5 V6的CPU,说明书上应该有明确说明。
BIOS更新:有时,更新主板的BIOS版本可以让主板支持新型号的CPU。因此,请查看您的主板制造商的网站,检查是否有支持至强系列E3 V5 V6的CPU的BIOS更新。
咨询专业人士:如果您不确定如何查找这些信息,可以联系您的电脑制造商或技术支持部门以获取帮助。他们可以根据您提供的电脑型号和配置信息为您提供准确的建议。
需要注意的是,仅从已安装的驱动程序判断是不准确的,因为驱动程序通常支持多种不同的硬件设备。因此,请按照上述建议来确定您的电脑是否支持至强系列E3 V5 V6的CPU。
以上就是关于java获取cpu温度,跪求源代码。。。全部的内容,包括:java获取cpu温度,跪求源代码。。。、VC++ MFC如何获取CPU ID及硬盘的序列号、cpu有驱动吗怎么提高CPU性能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)