VC中对CPU占用率的控制

1下面代码生成了一条CPU占用率为50%的直

第一种方法

for(;;)
	{
		for(int i=0;i<6600000;i++)//这个数字根据个PC的主频计算,结合机器周期与时钟周期的知识计算并做适当调节得到
			;
		Sleep(100);//这里的数值不易过小,若远小于Windows的调度时间片,会造成线程频繁的唤醒和挂起,无形中增加了内核时间
				    //的不确定性
	}


这里注意的是:由于现在的PC多为多核,为方便控制占用率可通过调节进程的相关性设置具体的CPU(在任务管理器中右击运行的进程,选择“设置相关性”即可),也可,通过SetProcessAffinityMask函数进行设置例如通过在进程中增加SetProcessAffinityMask(GetCurrentProcess(),2)语句即把当前进程所用的CPU设置为第二个(CPU 1).至于CPU曲线的变化可同过资源监视器来获得。该程序的CPU占有率曲线如下图:


第二种方法:

   

    int busytime=100;
	int idletime=busytime;
	long starttime=0;
	while(true)
	{
		starttime=GetTickCount();
		//std::cout<<starttime<<std::endl;//调试用
		while((GetTickCount()-starttime)<=busytime)
			;
		Sleep(idletime);
	}


说明:这种方法引入了GetTickCount()(具体用法参见MSDN)来返回自开机后所运行的时间,而不必手动计算循环数;并且比较精准,效果如下(可以看到效果比方法一要好):


2 sin曲线的生成

        const double SPLIT=0.01;
	const int COUNT=200;
	const double PI=3.1415926;
	const int INTERVAL=300;
	float busyspan[COUNT];
	float idlespan[COUNT];
	int half =INTERVAL/2;
	double radian=0.0;
	for(int i=0;i<COUNT;i++)
	{
		busyspan[i]=half+half*sin(PI*radian);
		idlespan[i]=INTERVAL-busyspan[i];
		radian+=SPLIT;
	}
	DWORD starttime=0;
	int j=0;
	while(true)
	{
		j=j%COUNT;
		starttime=GetTickCount();
		while((GetTickCount()-starttime)<=busyspan[j])
			;
		Sleep(idlespan[j]);
		j++;
	}
效果图如下:



通过学习,对MSDN的使用进一步得到了熟悉,对线程与进程的知识又增进了了解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值