码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-09-04 20:42:30      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   for   art   div   sp   log   on   

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%%\n",get_cpu_usage(m),get_thread_cpu_usage(c));
		i++;
	}
	printf("Hello World!\n");
	return 0;
}

 

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

标签:blog   io   ar   for   art   div   sp   log   on   

原文地址:http://www.cnblogs.com/lzpong/p/3956712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!