本文主要是介绍编程之美 1.1 Windows控制CPU占有率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.1 让CPU占有率听你指挥
题目:Windows环境下,写一个程序控制CPU占有率,具体
- CPU的占有率固定在50%,为一条直线。
- CPU占有率为一条直线,具体参数可调。
- CPU占有率呈一条正弦曲线。
解题思路:
- 任务监控器下CPU占有率是1秒进行一次采样的。让CPU工作指定时间,休息指定时间就可以控制占有率曲线。
- 其中指定休息时间可以使用Sleep()函数,工作指定时间则需要计算。在此使用GetTickCount()。
- 对于现在电脑都是多核的情况,需要指定某个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掩码,具体对应关系可以自己尝试。
这篇关于编程之美 1.1 Windows控制CPU占有率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!