Windows资源管理器-占用率-sin曲线

// CpuCurve.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <assert.h>
#include <iostream>
#include <Windows.h>
#include <math.h>
using namespace std;
#define M_PI 3.1415
#define THREADCNT 4
double RunTime = 0.0;    //总计的执行时间:分为sleep和do - something


DWORD WINAPI threadFunc(LPVOID param);
void Work(float c);
void CoreFunc();

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD coreCnt = 0;
    HANDLE *hThread;
    double timeCnt(0.0);
    LARGE_INTEGER lFreqStart,lFreqEnd,lFreqCnt;
    double Temp(0.0);
    //获得最大执行时长:不精确
    while (abs(timeCnt < M_PI) )
    {
        ::QueryPerformanceCounter( &lFreqStart );
        Work( ( 1 + sin(timeCnt) ) );
        ::QueryPerformanceCounter(&lFreqEnd);
        ::QueryPerformanceFrequency( &lFreqCnt );
        RunTime = max(RunTime,((double)(lFreqEnd.QuadPart - lFreqStart.QuadPart))/(double)(lFreqCnt.QuadPart));
        timeCnt += 0.1;
    }

    RunTime += 0.1;    //误差校准:防止溢出
    SYSTEM_INFO sysinfo;
    ::GetSystemInfo(&sysinfo);
    coreCnt = sysinfo.dwNumberOfProcessors;
    hThread = new HANDLE[coreCnt];
    memset(hThread,NULL,sizeof(HANDLE)*coreCnt);
    while( coreCnt-- )
    {
        hThread[coreCnt] = CreateThread(NULL,0,threadFunc,NULL,0,NULL);
    }
    DWORD dR = WaitForMultipleObjects(THREADCNT,hThread,FALSE,INFINITE);
    switch (dR)
    {
    case WAIT_OBJECT_0:
        cout<<"Thread 0 return"<<endl;
        break;
    case WAIT_OBJECT_0 + 1:
        cout<<"Thread 1 return"<<endl;
        break;
    case WAIT_OBJECT_0 + 2:
        cout<<"Thread 2 return"<<endl;
        break;
    case WAIT_OBJECT_0 + 3:
        cout<<"Thread 3 return"<<endl;
        break;
    }

    return 0;
}

DWORD WINAPI threadFunc(LPVOID param)
{
    CoreFunc();
    return 1;
}

void CoreFunc()
{
    double timeCnt = 0.0;                            //时间轴线
    LARGE_INTEGER lTemp = {0};    
    double sT,eT,fC,exeTime;                        //开始,结束,计数器,占用CPU时间
    QueryPerformanceFrequency(&lTemp);
    fC = double(lTemp.QuadPart);
    DWORD sleepTime(0);
    while( 1 )
    {
         //do-something
        QueryPerformanceCounter(&lTemp);            //计时开始
        sT = double(lTemp.QuadPart);
        Work( sin(timeCnt) + 1);
        QueryPerformanceCounter(&lTemp);            //计时结束
        eT = double(lTemp.QuadPart);
        exeTime = (eT - sT)/fC;                    //获得实际占用CPU时间
        cout<<"exeTime="<<exeTime*1000<<endl;
        if( abs(RunTime - exeTime) < 0.01)
            sleepTime = 0;
        else
            sleepTime = (DWORD)((RunTime - exeTime)*1000);
        cout<<"sleepTime="<<sleepTime<<endl;
        Sleep( sleepTime );
        timeCnt += 0.5;
    }
}

void Work(float c)
{
    int ic = (int)(c*10000*20);
    
    while( ic-- > 0)
    {
        for (int j = 1; j < 1000; j++ );
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值