1.1让CPU占用率听你的指挥
1.CPU的占用率固定在50%,为一条直线;
解法一:
#include<iostream.h>
#include <windows.h>//头文件
int main()
{
for(;;)
{
for(int i=0;i<10800000;i++);
Sleep(10);//注意VC中S大写
}
return 0;
}
缺点循环的次数不一定固定,不同的CPU是不同的计算方法,cpu的频率*10^9*2/5.原因是cpu每个时钟周期大概2条代码。一个循环的之行是由5条汇编代码组成的,所以平均每秒的之行次数为上面的计算结果。
解法二:
#include<iostream.h>
#include <windows.h>
const DWORD busyTime=10;
const DWORD idleTime=busyTime;
int main()
{
DWORD startTime=GetTickCount();
while((GetTickCount()-startTime)<=busyTime);
Sleep(idleTime);
return 0;
}
2.CPU的占用率为一条直线,具体占用率由命令行参数决定(参数范围1-100);
//c#code
static voic makeUsage(float level)
{
PerformanceCounter p=new PerformanceCounter("Processor","%Processor Time","_Total");
while(true)
{
if(p.NextValue>leval)
System.Threading.Thread.Sleep(10);
}
}
3 CPU的占用率为一条正弦曲线
#include<iostream.h>
#include <windows.h>
#include<math.h>
//把一条正弦曲线0-2PI之间的弧度等分成200分进行抽样,计算每个抽样点的振幅
//然后把每咯300ms的时间取下一个抽样点,并让CPU工作对应振幅的时间。
const int SAMPLING_COUNT=200;//抽样点数量
const double PI=3.1415926535;//pi的值
const int TOTAL_AMPLTUDE=300;//每个抽样点对应的时间片
int main(int argc,char* argv[])
{
DWORD busySpan[SAMPLING_COUNT];
int amplitude=TOTAL_AMPLTUDE/2;
double radian=0.0;
double randianIncrement=2.0/(double)SAMPLING_COUNT;//抽样弧度的增量
for(int i=0;i<SAMPLING_COUNT;i++)
{
busySpan[i]=(DWORD)(amplitude+sin(PI*radian)*amplitude);
radian+=randianIncrement;
}
DWORD startTime=0;
for(int j=0;;j=(j+1)%SAMPLING_COUNT)
{
startTime=GetTickCount();
while((GetTickCount()-startTime)<=busySpan[j])
;
Sleep(TOTAL_AMPLTUDE-busySpan[j]);
}
return 0;
}
如果是使用双核,所以需要在任务管理器里设置其中一个CPU运行程序.使用SetThreadAffinityMask()和GetProcessorInfo().
总结:一些windows的API
1.sleep()当前线程“停”下来
2 WaitForSigleProject()自己停下来。等待某个事件发生
3.GetTickCount ()系统启动到现在经历的毫秒值
4.QueryPerformanceFrequency(),QueryPerformanceCounter()访问精确度更高的CPU数据
5timeGetSystemTime()另一个得到高精度时间的方法
6 PerformanceCounter()效能计数器
7GetProcessorIInfo()/SetThreadAffinityMask()遇到多核的CPU的时候,控制cpu
8 getCPUTickCount()拿到CPU核心运行周期数。