高分求助2,怎么样得到机器cpu主频

bachelor 2003-03-18 08:20:22
怎么样得到机器cpu型号和主频,谢谢啦
...全文
111 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dmsun 2003-03-21
  • 打赏
  • 举报
回复
我加了lib,而且还是用cb生成的,还是无法调用。我的系统win2000professional sp3+cb6
Iamme 2003-03-21
  • 打赏
  • 举报
回复
可以静态调用,连接时添加Powrprof.lib
Iamme 2003-03-21
  • 打赏
  • 举报
回复
这个函数在最新的SDK里有,你的MSDN一定比较老了。这个函数可以用于WIN9x。                                  NowCan(能量、激情、雨水、彩虹——雷雨云) ( ) 你的注册表的方法倒可能受系统版本限制
Iamme 2003-03-21
  • 打赏
  • 举报
回复
哦,你包含那个头文件时用extern “C”{}试试
NowCan 2003-03-20
  • 打赏
  • 举报
回复
NTPowerInformation
初步看了一下,查询主频好像只能用于Win2000。
shally5 2003-03-20
  • 打赏
  • 举报
回复
关注
dmsun 2003-03-20
  • 打赏
  • 举报
回复
Iamme(不死鸟) :
你说的函数msdn里查不到。具体怎么用举个例子吧。
bachelor 2003-03-20
  • 打赏
  • 举报
回复
是吗?
我可以看看
大白鲨的那个方法算出来有时候是负数,很奇怪的
dmsun 2003-03-20
  • 打赏
  • 举报
回复
Client: Included in Windows XP, Windows 2000 Professional, Windows Me, and Windows 98.
Server: Included in Windows Server 2003 and Windows 2000 Server.
Header: Declared in Powrprof.h.
Library: Use Powrprof.lib.

下面是个例子:

typedef struct _PROCESSOR_POWER_INFORMATION {
ULONG Number;
ULONG MaxMhz;
ULONG CurrentMhz;
ULONG MhzLimit;
ULONG MaxIdleState;
ULONG CurrentIdleState;
}
PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;

PROCESSOR_POWER_INFORMATION p;
typedef int (*getcpu)(POWER_INFORMATION_LEVEL,void*,ULONG,void*,ULONG);
HINSTANCE hinst=LoadLibrary("powrprof.dll");
getcpu g=(getcpu)GetProcAddress(hinst,"CallNtPowerInformation");
g(ProcessorInformation,NULL,0,&p,sizeof(p));

有几个问题大家探讨一下:
1. 我试了一下该函数在cb下不能静态调用。报错:
[Linker Error] Unresolved external '__stdcall CallNtPowerInformation (POWER_INFORMATION_LEVEL, void *, unsigned long, void *, unsigned long)' referenced from G:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ

2. 返回值中主频是对的,但是cpu个数却是0,我的机器是一个cpu的。谁试一下2个cpu的系统。
Iamme 2003-03-19
  • 打赏
  • 举报
回复
获得主频有个API,CallNTPowerInformation
NowCan 2003-03-18
  • 打赏
  • 举报
回复
WinNT的注册表有这么一项。
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
coolbye 2003-03-18
  • 打赏
  • 举报
回复
注册表中存了相关信息
halibut 2003-03-18
  • 打赏
  • 举报
回复
这里也有一篇:
http://vip.6to23.com/NowCan1/tech/cpuspeed.htm
halibut 2003-03-18
  • 打赏
  • 举报
回复
注:这个帖子是转载bearbaba 的:



检测CPU的型号
  先让我们从最简单的做起,看一看自己的CPU型号。首先,在C++ Builder中画出图1所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范,它包括一个用来激活测试的Button和一个用来显示结果的Memo。我们可以用GetSystemInfo这个API获得CPU的型号。将下列代码添加到Button的Click事件里就可以了:
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  //获得CPU型号
  SYSTEM_INFO systeminfo;
  GetSystemInfo (&systeminfo);
  Memo1→Lines→Add(“您的CPU类型是:”+String( systeminfo.dwProcessorType ));
  }
halibut 2003-03-18
  • 打赏
  • 举报
回复
注:以下的帖子是大白鲨的,在此只是转载:


说到检测CPU的速度,一般是测试在单位时间内运算的指令条数,但用这种方法有太大的局限
性,
由于受到很多因素的影响,准确度比较低,特别是在Windows环境下,
你不知道在你的程序外别的程序占用了多少的时间片。其实,在586及以上档次处理器中,
已经有了一条专用的指令来测试主频,那就是 RDTSC指令,意思是读取时间标记计数器,
是处理器内部的一个64位的MSR (model specific register),它每个时钟增加一个记数。
在处理器复位的时候,初始值为0,RDTSC 指令把 TSC的值低32位装入EAX中,
高32位装入EDX中。如果CPU的主频是200MHz,那么在一秒钟内,TSC的值增加 200.000.000次。
所以在计算的时候,把两次的TSC差值除以两次的时间差值就是CPU的主频。
程序的结构如下: 初始化的时候设置一个定时器,定时时间为1秒,然后在定时器消息中利用
RDTSC 取得 TSC计数,再和上次保留的值相减,然后除以时间差即可。
bcb OK
#prgram inline
void __fastcall TForm1::Button1Click(TObject *Sender)
{

DWORD eax1,edx1,eax2,edx2;
asm
{
rdtsc
mov eax1,eax
mov edx1,edx
}
Sleep(1000);
asm{
rdtsc
mov eax2,eax
mov edx2,edx
}

eax2-=eax1;
edx2-=edx1;

edx2*=2147483647;
edx2+=eax2;
Label2->Caption=IntToStr(edx2);
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧