zoukankan      html  css  js  c++  java
  • CPU占用率呈正弦实现,及实时输出进程和线程的CPU占用率

    CPU占用率呈正弦实现,及实时输出进程和线程的CPU占用率

    #include "stdafx.h"
    #include <windows.h>
    #include <math.h>
    
    // 时间转换
    static __int64 file_time_2_utc(const FILETIME* ftime)
    {
        LARGE_INTEGER li;
    
        li.LowPart = ftime->dwLowDateTime;
        li.HighPart = ftime->dwHighDateTime;
        return li.QuadPart;
    }
    
    // 获得CPU的核数
    static int get_processor_number()
    {
        SYSTEM_INFO info;
        GetSystemInfo(&info);
        return (int)info.dwNumberOfProcessors;
    }
    // 获取进程CPU占用
    int get_cpu_usage(HANDLE hand)
    {  
        //cpu数量
        static int processor_count_ = -1;
        //上一次的时间
        static __int64 last_time_ = 0;
        static __int64 last_system_time_ = 0;
    
        FILETIME now;
        FILETIME creation_time;
        FILETIME exit_time;
        FILETIME kernel_time;
        FILETIME user_time;
        __int64 system_time;
        __int64 time;
        __int64 system_time_delta;
        __int64 time_delta;
    
        int cpu = -1;
    	if(hand==NULL)
    		return cpu;
        if(processor_count_ == -1)
        {
            processor_count_ = get_processor_number();
        }
    
        GetSystemTimeAsFileTime(&now);
    
        //HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
        if (!GetProcessTimes(hand, &creation_time, &exit_time, &kernel_time, &user_time))
        {
            return -1;
        }
        system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / processor_count_;
        time = file_time_2_utc(&now);
    
        if ((last_system_time_ == 0) || (last_time_ == 0))
        {
            last_system_time_ = system_time;
            last_time_ = time;
            return -1;
        }
    
        system_time_delta = system_time - last_system_time_;
        time_delta = time - last_time_;
    
        if (time_delta == 0)
            return -1;
    
        cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
        last_system_time_ = system_time;
        last_time_ = time;
        return cpu;
    }
    // 获取线程CPU占用
    int get_thread_cpu_usage(HANDLE hand)
    {
        //cpu数量
        static int processor_count_ = -1;
        //上一次的时间
        static __int64 last_time_ = 0;
        static __int64 last_system_time_ = 0;
    	
        FILETIME now;
        FILETIME creation_time;
        FILETIME exit_time;
        FILETIME kernel_time;
        FILETIME user_time;
        __int64 system_time;
        __int64 time;
        __int64 system_time_delta;
        __int64 time_delta;
    	
        int cpu = -1;
    	if(hand==NULL)
    		return cpu;
        if(processor_count_ == -1)
        {
            processor_count_ = get_processor_number();
        }
    	
        GetSystemTimeAsFileTime(&now);
    	
        //HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
        if (!GetThreadTimes(hand, &creation_time, &exit_time, &kernel_time, &user_time))
        {
    	return -1;
        }
        system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) / processor_count_;
        time = file_time_2_utc(&now);
    	
        if ((last_system_time_ == 0) || (last_time_ == 0))
        {
            last_system_time_ = system_time;
            last_time_ = time;
            return -1;
        }
    	
        system_time_delta = system_time - last_system_time_;
        time_delta = time - last_time_;
    	
        if (time_delta == 0)
            return -1;
    	
        cpu = (int)((system_time_delta * 100 + time_delta / 2) / time_delta);
        last_system_time_ = system_time;
        last_time_ = time;
        return cpu;
    }
    //CPU占用率呈正弦实现
    const double SPLIT = 0.01;
    const int COUNT = 200;
    const double PI = 3.14159265;
    const int INTERVAL = 300;
    UINT ThreadFunT()
    {
        DWORD busySpan[COUNT];  //array of busy times
        DWORD idleSpan[COUNT];  //array of idle times
        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;
    }
    
    int main(int argc, char* argv[])
    {
    	HANDLE m,c;
    	DWORD ThreadID;
    	int i=0;
    	//让进程在指定处理器上运行
    	SetProcessAffinityMask(
    		GetCurrentProcess(),
    		0x00000001          //cpu mask
             );
    	m=GetCurrentProcess();
    //	c=CreateThread(NULL,
    //		0,
    //		(LPTHREAD_START_ROUTINE)ThreadFunT,
    //		NULL,
    //		0,
    //		&ThreadID);
    	Sleep(300);
    	c=CreateThread(NULL,
    		0,
    		(LPTHREAD_START_ROUTINE)ThreadFunT,
    		NULL,
    		0,
    		&ThreadID);
    	while (i<200)
    	{
    		Sleep(100);
    		printf("CPU:%d%%  Thread:%d%%
    ",get_cpu_usage(m),get_thread_cpu_usage(c));
    		i++;
    	}
    	printf("Hello World!
    ");
    	return 0;
    }
    
  • 相关阅读:
    两台电脑间的消息传输
    商品库存订购管理管理程序代写代做代开发
    基于ssh的汽车配件进销存系统
    Ajax初识
    系统排队仿真源代码
    模拟一个排队系统
    Linux下,C++编程论坛题目抽取
    实践是检验真理的唯一标准2 脱壳篇03
    迪杰斯特拉算法
    最短路径求法
  • 原文地址:https://www.cnblogs.com/lzpong/p/3956712.html
Copyright © 2011-2022 走看看