怎样编程获得CPU的主频?

fengcaho 2004-08-01 08:20:49
如题,我在CSDN文档上也找到了一篇,
http://dev.csdn.net/develop/article/30/30187.shtm
可是缺点是计算CPU的主频的时候电脑会停顿一下,有没有更好的方法
...全文
146 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lanstar200 2004-08-05
讀註冊表
回复
ahejn 2004-08-05
为什么返回值不准确,我的P4 2.4G,返回 119356555
回复
桂堂 2004-08-03
我的也是AMD XP2500+ !
回复
狂放之歌 2004-08-03
呵呵,现在的cpu一般都支持.
以前我也遇见过,到csdn发贴子问过,,有一个兄弟 说它的AMD XP2500+支持
回复
donghongtao 2004-08-02
高手,楼上的,可否有那位高手说一下,如何获得CPU的温度呢?
回复
aspnetwuxueyou 2004-08-02
选自袁峰的《windows图形编程》
回复
aspnetwuxueyou 2004-08-02
Of the Intel Pentium series CPU features that are not accessible from C/C++, one instruction is very interesting to performance-minded programmers. That's the RDTSC (Read Time Stamp Counter) instruction, which returns the number of clock cycles passed since the booting of the CPU in 64-bit unsigned integer, through the EDX and EAX 32-bit general register pair. This means you can time your program in 5-nanosecond precision on a Pentium 200-MHz machine for 117 years.

回复
aspnetwuxueyou 2004-08-02
inline void RDTSC()
{
__asm _emit 0x0f;
__asm _emit 0x31;
}
只对Intel的cpu好用,别的cpu你还得查文档
回复
taianmonkey 2004-08-01
// GetCpuFreq.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

////////////////////////////////////////////////////////////////////////////////////////
//
// FileName : CPUSpeed.cpp
// Version : 0.1
// Creater : Luo Cong
// Date : 2003-09-20 (yyyy-mm-dd)
// Comment :
//
////////////////////////////////////////////////////////////////////////////////////////

#include <windows.h>

inline void RDTSC()
{
__asm _emit 0x0f;
__asm _emit 0x31;
}

unsigned int GetCPUSpeed()
{
unsigned int nRetSpeed;

__asm xor eax, eax;
__asm xor edx, edx;
RDTSC();
__asm push edx;
__asm push eax;
Sleep(1000);
RDTSC();
__asm pop ecx;
__asm pop ebx;
__asm sub eax, ecx;
__asm sbb edx, ebx;
__asm mov ecx, 10//1000000;
__asm div ecx;
__asm
{
cmp edx, 500000h;
jb INCEAX;
jmp CONTINUE;
INCEAX:
inc eax;
CONTINUE:
mov nRetSpeed, eax;
}

return nRetSpeed;
}

int main()
{
unsigned int nCPUSpeed;
char szCPUSpeed[100] = { 0 };

nCPUSpeed = GetCPUSpeed();
wsprintf(szCPUSpeed, "Your CPU speed is: %d hz", nCPUSpeed);
MessageBox(NULL, szCPUSpeed, "CPU Speed", MB_OK | MB_ICONINFORMATION);

return 0;
}
回复
softworms 2004-08-01
sorry,上面的东东贴错了位置!请楼主见谅!
回复
softworms 2004-08-01
抛弃WM_COPYDATA吧,它要求必须在窗口创建之后,麻烦,不如:
++ 内存映射文件使用步骤

1、使用CreateFileMapping()函数创建一个内存映射文件,它需要一个文件句柄作为参数。
使用文件类或文件操作API得到需要待映射的物理文件的句柄,如果直接使用内存映射文件就将句柄置为0xffffffff即可,函数成功调后会返回一个内存映射文件句柄,失败则为NULL。

2、要对内存映射文件进行读写操作时,必须要将它映射到本进程的地址空间中,可以通过使用MapViewOfFile()API达到这一目的,当调用成功后将返回一个指向文件开始处的指针,我把可以把它转化为char类型的指针从而进行简单方便的读写工作,操作函数任选。

3、完成读写操作后,需要使用UnMapViewOfFile()API来取消地址空间的映射,并且将对内存映射文件作的修改回写到物理文件中(只在映射物理文件时,才发生更新操作)。

4、最后使用CloseHandle()API关闭内存映射文件的句柄及打开物理文件句柄(如果有的话)。

5、在生成内存映射文件时指定一个串用于标识它,这样其它进程就能通过OpenFileMapping()API打开这个内存映射文件进行进程间大块数据的交换工作了。

6、操作内存映射文件时应注意指定它的访问权限及映射大小,一不小心会造成调用失败。

例程(主进程部分):最好在不使用文件时,关闭它的句柄!
1、
CString str="初步完成内存映射文件的学习!了不起!继续加油啊!";
hFileMapping=::CreateFileMapping((HANDLE)0xffffffff,//直接使用内存
NULL,
PAGE_READWRITE,//访问权限
0,//文件大小高字
str.GetLength(),//文件大小低字
"ShareData");//文件的系统全局标识
char* pFileMapping=(char*)::MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
0);//后三个全0参数指映射全部文件内容
strcpy(pFileMapping,str.GetBuffer(1));//对映射文件进行写入操作
::UnmapViewOfFile(pFileMapping);//结束映射
ASSERT(!::GetLastError());

第二进程(共享目的)
CString str;
HANDLE hFileMapping=::OpenFileMapping(FILE_MAP_ALL_ACCESS,//访问权限
false,//句柄不可继承
"ShareData");//通过系统全局标识找到文件
ASSERT(hFileMapping);
char* pFileMapping=(char*)::MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
0);//将全部文件内容映射到地址空间来
ASSERT(pFileMapping);
str.Format("%s",pFileMapping);//完成数据读入工作
::MessageBox(NULL,str,"共享",0);//使用共享数据。

***重点!!!
在两进程共享内存映射文件时,可以让服务进程准备好数据后,利用SendMessage()函数给客户进程发个消息告诉它数据已准备好可以去取了。SendMessage()API的一个特性就是它发送的消息只有处理完毕后,它才会返回,这样就有足够的时间让客户进程去访问完数据后,服务进程再关闭内存映射文件。
回复
相关推荐
发帖
硬件/系统
创建于2007-09-28

2596

社区成员

VC/MFC 硬件/系统
申请成为版主
帖子事件
创建了帖子
2004-08-01 08:20
社区公告
暂无公告