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的使用进一步得到了熟悉,对线程与进程的知识又增进了了解。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows,获取CPU使用率可以使用PerformanceCounter类和ManagementObject类来实现。 首先,可以使用PerformanceCounter类从计算机性能计数器获取CPU使用率。通过实例化PerformanceCounter类并指定相关的性能计数器类别和计数器名称,可以获取到CPU使用率。代码示例如下: ```csharp PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); float cpuUsage = cpuCounter.NextValue() / Environment.ProcessorCount; System.Threading.Thread.Sleep(1000); // 等待1秒 cpuUsage = cpuCounter.NextValue() / Environment.ProcessorCount; Console.WriteLine("CPU使用率: " + cpuUsage.ToString("0.00") + "%"); ``` 以上代码实例化了PerformanceCounter类,并指定了Processor类别的"% Processor Time"计数器。通过调用NextValue()方法获取计数器的下一个值,然后除以ProcessorCount得到CPU使用率。为了获取到实时的CPU使用率,sleep方法会等待1秒钟再次获取值。最后将获取到的值输出。 另外一种方式是使用ManagementObject类从Windows Management Instrumentation (WMI) 获取CPU使用率。通过使用WQL (Windows Management Query Language) 查询语句来获取相关信息,代码示例如下: ```csharp ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor"); ManagementObjectCollection collection = searcher.Get(); foreach (ManagementObject obj in collection) { if (obj["Name"].ToString() == "_Total") { float cpuUsage = 100 - float.Parse(obj["PercentIdleTime"].ToString()); Console.WriteLine("CPU使用率: " + cpuUsage.ToString("0.00") + "%"); break; } } ``` 以上代码使用ManagementObjectSearcher类指定WQL查询语句,通过Get()方法获取到相关的性能数据。然后遍历获取到的集合,找到Name为"_Total"的对象,通过PercentIdleTime属性计算CPU使用率。 无论是使用PerformanceCounter类还是ManagementObject类,都能够获取到WindowsCPU使用率。具体使用哪种方式可以根据需要来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值