可以用Windows API来指定CPU,代码如下:
//让进程在指定处理器上运行(在第一个CPU上运行, 对多CPU的处理) SetProcessAffinityMask( GetCurrentProcess(), 0x00000001 //cpu mask );
#include <stdio.h> #include <stdlib.h> #include "windows.h" //控制CPU , 需要计算CPU运行时间 int main() { //让进程在指定处理器上运行(在第一个CPU上运行, 对多CPU的处理) SetProcessAffinityMask( GetCurrentProcess(), 0x00000001 //cpu mask ); for(;;) { //CPU 2.0GHZ 4核心 8线程 //计算方法: 2.0*10的9次方 , 现代CPU每个时钟周期可以执行2条以上的代码 //2000 000 000*2/5=800 000 000 平均 for(int i=0;i<8000000;i++) ; Sleep(10);//10ms比较接近windows的调度时间片 } //system("PAUSE"); return 0; }
GetTickCount()的作用是返回从操作系统启动到现在所经过的毫秒数。
这样做的好处就是不用估算CPU的频率了,较上面的方法肯定好多了。
#include <stdio.h> #include <stdlib.h> #include "windows.h" //控制CPU int main() { //让进程在指定处理器上运行(在第一个CPU上运行, 对多CPU的处理) SetProcessAffinityMask( GetCurrentProcess(), 0x00000001 //cpu mask ); int busyTime = 100; int idleTime = busyTime; int start = 0; while(true) { //用系统函数省去了CPU运行时间的估算 start = GetTickCount(); while((GetTickCount() - start) <= busyTime) ; //空闲 Sleep(idleTime); } //system("PAUSE"); return 0; }
效果:
代码:
#include <Windows.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <tchar.h> const double SPLIT = 0.01; const int COUNT = 200; const double PI = 3.14159265; const int INTERVAL = 300; //间隔时间 //画出一条正弦曲线 int _tmain(int argc, _TCHAR* argv[]) { //让进程在指定处理器上运行(在第一个CPU上运行, 对多CPU的处理) SetProcessAffinityMask( GetCurrentProcess(), 0x00000001 //cpu mask ); //1. 设置忙与闲时的时间数组 DWORD busySpan[COUNT]; //array of busy times DWORD idleSpan[COUNT]; //array of idle times int half = INTERVAL / 2; double radian = 0.0; //弧度 for(int i = 0; i < COUNT; i++) { //sin(x)的取值范围是[-1,1],为了完整显示,必须给它作些参数调整 busySpan[i] = (DWORD)(half + (sin(PI * radian) * half)); idleSpan[i] = INTERVAL - busySpan[i]; radian += SPLIT; //每次增一点点 } //测试:输出忙与闲时的时间数组, 写入文件result.txt FILE *fp; fp = fopen("result.txt", "a+"); //a+表示追加方式 for(int i = 0; i < COUNT; i++) { //printf("busySpan[%d] is %d\n",i,busySpan[i]); //printf("idleSpan[%d] is %d\n\n",i,idleSpan[i]); fprintf(fp, "busySpan[%d] is %d\n" , i, busySpan[i]); fprintf(fp, "idleSpan[%d] is %d\n\n" , i , idleSpan[i]); } fclose(fp); //2. 画曲线 DWORD startTime = 0; int j = 0; while (true) { j = j % COUNT; //COUNT次为一个周期 startTime = GetTickCount(); while ((GetTickCount() - startTime) <= busySpan[j]) ; Sleep(idleSpan[j]); j++; } return 0; }
转载请注明出处