int busyTime = 10; // 10 ms int idleTime = busyTime; // same ratio will lead to 50% cpu usage Int64 startTime = 0; while(true) { startTime = GetTickCount(); // busy loop while((GetTickCount() - startTime) <= busyTime) ; // idle loop Sleep(idleTime); } 根据提供的信息,我们可以总结出以下相关的IT知识点: ### 1. CPU使用率控制技术 **标题与描述**:计算机完美编程(C,Java,C++,C#)介绍了一个通过循环来控制CPU使用率的方法。 #### 知识点详情: - **忙等待(Busy Loop)与空闲等待(Idle Loop)**: - **忙等待**:通过循环让程序在一定时间内持续运行,不执行任何有意义的操作。这种方式会消耗CPU时间,从而提高CPU的使用率。 - **空闲等待**:使用`Sleep()`函数让当前线程暂停一段时间。这可以降低CPU的使用率。 - **示例代码**: ```c int busyTime = 10; // 设置忙碌时间为10毫秒 int idleTime = busyTime; // 空闲时间与忙碌时间相同,以保持50%的CPU使用率 Int64 startTime = 0; while (true) { startTime = GetTickCount(); // 忙碌循环 while ((GetTickCount() - startTime) <= busyTime) ; // 空闲循环 Sleep(idleTime); } ``` - **原理解析**: - 使用`GetTickCount()`获取当前的时间戳。 - 在忙碌循环中,持续检查时间差是否小于等于`busyTime`,直到满足条件才退出循环。 - 在空闲循环中,调用`Sleep(idleTime)`使线程暂停指定的时间。 - 这样通过调整`busyTime`和`idleTime`的比例,可以控制CPU的使用率。 ### 2. C# 中的性能监控 #### 知识点详情: - **PerformanceCounter类**:用于监控系统或应用程序的性能计数器。 - `PerformanceCounter`类提供了一种方便的方式来读取操作系统中的性能计数器数据。 - 示例代码: ```csharp static void MakeUsage(float level) { PerformanceCounter p = new PerformanceCounter("Processor", "%ProcessorTime", "_Total"); if (p == null) return; while (true) { if (p.NextValue() > level) System.Threading.Thread.Sleep(10); } } ``` - **原理**: - 创建`PerformanceCounter`实例来监控处理器的使用百分比。 - 使用`NextValue()`方法获取处理器的使用率。 - 如果处理器使用率超过指定的水平,则使线程睡眠10毫秒。 ### 3. C++ 生成任务管理器中的正弦波图 #### 知识点详情: - **数学库与Windows API的结合**: - 使用数学库计算正弦波函数的值。 - 使用Windows API函数(如`GetTickCount()`和`Sleep()`)实现忙碌和空闲循环。 - 示例代码: ```cpp #include "Windows.h" #include "stdlib.h" #include "math.h" const double SPLIT = 0.01; const int COUNT = 200; const double PI = 3.14159265; const int INTERVAL = 300; int _tmain(int argc, _TCHAR* argv[]) { DWORD busySpan[COUNT]; DWORD idleSpan[COUNT]; int half = INTERVAL / 2; double radian = 0.0; for (int i = 0; i < COUNT; i++) { busySpan[i] = (DWORD)(half + (sin(PI * radian) * half)); 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++; } return 0; } ``` - **原理**: - 通过数学公式计算每个周期内的忙碌时间和空闲时间。 - 使用循环来不断更新忙碌和空闲时间,并通过`Sleep()`函数实现。 ### 4. 计算机性能信息查询 #### 知识点详情: - **Windows API 函数 NTPowerInformation**: - `NTPowerInformation`用于查询有关处理器的信息。 - 示例代码: ```cpp _PROCESSOR_POWER_INFORMATION info; CallNtPowerInformation(11, // query processor power information NULL, // no input buffer 0, // input buffer size is zero &info, // output buffer sizeof(info)); // out buf size ``` - **原理**: - 使用`CallNtPowerInformation`函数查询处理器的功率信息。 - 参数`11`表示查询的是处理器的功率信息。 - 返回的信息可以通过`_PROCESSOR_POWER_INFORMATION`结构体来访问。 ### 5. 位操作宏定义 #### 知识点详情: - **宏定义**:定义了一系列用于处理位操作的宏。 - 示例代码: ```cpp #define HALF_BITS_LENGTH 4 #define FULL_MASK 255 #define LMASK (FULL_MASK << HALF_BITS_LENGTH) #define RMASK (FULL_MASK >> HALF_BITS_LENGTH) #define RSET(b, n) (b = ((LMASK & b) ^ n)) #define LSET(b, n) (b = ((RMASK & b) ^ (n << HALF_BITS_LENGTH))) #define RGET(b) (RMASK & b) #define LGET(b) ((LMASK & b) >> HALF_BITS_LENGTH) ``` - **原理**: - 宏定义了处理位的掩码以及用于设置和获取位的宏。 - `HALF_BITS_LENGTH`定义了内存单元一半的长度。 - `FULL_MASK`定义了全部比特位的掩码。 - `LMASK`和`RMASK`分别定义了左半部分和右半部分的掩码。 - `RSET`和`LSET`用于设置右半部分和左半部分的值。 - `RGET`和`LGET`用于获取右半部分和左半部分的值。 以上是对所提供的代码片段进行分析后提取的关键知识点。这些知识点涵盖了多种编程语言的应用场景,包括C、C# 和 C++ 的具体实践案例。
剩余56页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助