C++ Builder 参考手册 ➙ TThread ➙ TSystemTimes
头文件:#include <System.Classes.hpp>
命名空间:System::Classes
类:TThread
访问权限:public:
类型定义:
struct TSystemTimes
{
public:
unsigned __int64 IdleTime;
unsigned __int64 UserTime;
unsigned __int64 KernelTime;
unsigned __int64 NiceTime;
};
TSystemTimes 是 TThread 结构体类型成员,用于计算 CPU 使用率,可以用 GetSystemTimes 方法获取这个结构体的值。
成员 | 类型 | 说明 |
---|---|---|
IdleTime | unsigned __int64 | 系统空闲时间 |
UserTime | unsigned __int64 | 处理用户进程的时间 |
KernelTime | unsigned __int64 | 处理系统核心的时间 |
NiceTime | unsigned __int64 | 处理 nice 用户进程的时间【注1】 |
【注1】某些操作系统的 root 用户可以用 nice 方式启动用户进程,可以设定进程的优先级,Windows 操作系统没有这种运行方式,NiceTime 等于 0。
计算 CPU 使用率的方法:
- 总时间 = UserTime + KernelTime + NiceTime
- 空闲时间 = IdleTime
- 工作时间 = 总时间 - 空闲时间
- 时间段长度 = 本次获取的总时间 - 上次获取的总时间
- 此段时间空闲 = 本次获取的空闲时间 - 上次获取的空闲时间
- 此段时间工作 = 时间段长度 - 此段时间空闲
- 此段时间 CPU 使用率 = 此段时间工作 / 时间段长度
这些计算 GetCPUUsage 方法已经处理好了,可以使用 GetSystemTimes 获取初始值,然后每次调用 GetCPUUsage 获取初始值到本次调用、或者两次调用 GetCPUUsage 之间的 CPU 使用率。
例1:通过计算的方法获取并且实时显示 CPU 使用率
在窗口上放一个定时器控件 Timer1,一个文字标签控件 Label1,和一个进度条控件 ProgressBar1:
窗口上放的控件在 .h 文件里面,TForm1 类的 private: 部分添加变量:
private: // User declarations
TThread::TSystemTimes SysTimes;
在 TForm1 的构造函数和定时器的 OnTimer 时间里面分别写如下代码:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TThread::GetSystemTimes(SysTimes);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TThread::TSystemTimes t;
TThread::GetSystemTimes(t);
// 计算两次获取 TThread::TSystemTimes 经过的时间
long long llElapsed = (t.UserTime + t.KernelTime + t.NiceTime)
- (SysTimes.UserTime + SysTimes.KernelTime + SysTimes.NiceTime);
if(llElapsed > 0)
{
long long llIdle = t.IdleTime - SysTimes.IdleTime; // 空闲时间
long long llWork = llElapsed - llIdle; // 工作时间
int iCpuRate = llWork * 100.0 / llElapsed + 0.5; // CPU 使用率
Label1->Caption = String().sprintf(L"CPU 使用率:%d%%", iCpuRate);
ProgressBar1->Position = iCpuRate;
}
SysTimes = t;
}
运行结果:
实时显示 CPU 使用率:运行结果例2:使用 TThread::GetCPUUsage 计算 CPU 使用率
👉 请参考 TThread::GetCPUUsage 的例子。
相关:
- System::Classes::TThread::GetSystemTimes
- System::Classes::TThread::GetCPUUsage
- System::Classes::TThread::IsSingleProcessor
- System::Classes::TThread::ProcessorCount
- System::Classes::TThread
- System::TObject
- VCL 类继承关系
C++ Builder 参考手册 ➙ TThread ➙ TSystemTimes
网友评论