美文网首页
TThread::TSystemTimes - C++ Buil

TThread::TSystemTimes - C++ Buil

作者: 玄坴 | 来源:发表于2020-06-10 08:51 被阅读0次

    C++ Builder 参考手册TThreadTSystemTimes


    头文件:#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 的例子。


    相关:


    C++ Builder 参考手册TThreadTSystemTimes

    相关文章

      网友评论

          本文标题:TThread::TSystemTimes - C++ Buil

          本文链接:https://www.haomeiwen.com/subject/wlrlohtx.html