编程之美 1.1 Windows控制CPU占有率

1.1 让CPU占有率听你指挥
题目:Windows环境下,写一个程序控制CPU占有率,具体
  1. CPU的占有率固定在50%,为一条直线。
  2. CPU占有率为一条直线,具体参数可调。
  3. CPU占有率呈一条正弦曲线。
解题思路:
  1. 任务监控器下CPU占有率是1秒进行一次采样的。让CPU工作指定时间,休息指定时间就可以控制占有率曲线。
  2. 其中指定休息时间可以使用Sleep()函数,工作指定时间则需要计算。在此使用GetTickCount()。
  3. 对于现在电脑都是多核的情况,需要指定某个CPU运行程序,使用API SetThreadAffinityMask()。
CPU占有率为一条直线,具体参数可调。源码:
void setCpuUse(int use)
{
	int workTime = use;
	int idleTime = 100- workTime;
	DWORD startTime;
	while (1)
	{
		startTime = GetTickCount();
		while (GetTickCount() - startTime <= workTime);
		Sleep(idleTime);
	}
}

int main()
{
	SetThreadAffinityMask(GetCurrentThread(), 6);
	setCpuUse(20);
	return 0;
}
CPU占有率呈一条正弦曲线,源码:
int main()
{
	SetThreadAffinityMask(GetCurrentThread(), 8);

	const int SampleCount = 200; // 抽样点数量
	const double PI = 3.141592653; //π
	const int ToTAL_AMPLITUDE = 100; // 每个点对于总时间片
	const int amplitude = ToTAL_AMPLITUDE / 2; //三角函数振幅

	DWORD busySpan[SampleCount];
	
	for (int i = 0; i < SampleCount; ++i)
	{
		busySpan[i] = ToTAL_AMPLITUDE / 2 + amplitude * sin(i / (double)(SampleCount - 1) * 2 * PI);
	}

	DWORD startTime;
	for (int j = 0;; j = (j + 1) % SampleCount)
	{
		startTime = GetTickCount();
		while (GetTickCount() - startTime <= busySpan[j]);
		Sleep(ToTAL_AMPLITUDE - busySpan[j]);
	}
}

在这里插入图片描述

总结:用到的API

GetTickCount();
功能:返回系统开机以来运行的毫秒数。

BOOL WINAPI GetLogicalProcessorInformation(Out_writes_bytes_to_opt(*ReturnedLength, *ReturnedLength) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, Inout PDWORD ReturnedLength);
功能:获取处理器信息。

WINAPI SetThreadAffinityMask(In_ HANDLE hThread,In DWORD_PT dwThreadAffinityMask);
功能:设置某个线程运行在某个CPU上,dwThreadAffinityMask为CPU掩码,具体对应关系可以自己尝试。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值