在多线程环境中分析每个线程

时间:2009-03-16 18:04:17

标签: multithreading winapi mfc profiling

有没有办法找出使用MFC / Win32的CPU内部线程花费的实际时间?实际时间,我的意思是我不想计算线程在“运行”以外的状态所花费的时间。我在Win32 SDK中尝试了GetThreadTimes()方法,但无法获得正确的值。我想这样做是因为我想检查在其调度上设置ThreadPriority的效果,即如果我将线程优先级设置为THREAD_PRIORITY_BELOW_NORMAL而不是THREAD_PRIORITY_NORMAL会产生多大的差异?

以下是实际代码:

#include<iostream>
#include <afxwin.h>
#include <afxmt.h>
#include <time.h>



bool bStop = false;
long k1 = 0;
long k2 = 0;



UINT run1(LPVOID param)
{
    while(!bStop)
    {
        for(int i = 0; i < 10; ++i)
        {
            ++k1;
        }
    }


    return 0;
}


UINT run2(LPVOID param)
{
    while(!bStop)
    {
        for(int i = 0; i < 10; ++i)
        {
            ++k2;
        }
    }

    return 0;
}



void main(int argc,char *argv[])
{

    CWinThread* pThread1 =  AfxBeginThread(&run1, NULL, THREAD_PRIORITY_NORMAL);
    CWinThread* pThread2 =  AfxBeginThread(&run2, NULL, THREAD_PRIORITY_BELOW_NORMAL );

    Sleep(3 * 1000);

    bStop = TRUE;

    FILETIME f1,f2,f3,f4;
    GetThreadTimes(*pThread1, &f1,&f2,&f3,&f4);
    CTime t1(f4);



    std::cout<<"K1="<<k1<<"\n";
    std::cout<<"K2="<<k2<<"\n";
    std::cout<<"Thread1 Time="<<t1.GetSecond()<<"sec\n";
    std::cout<<"Exit\n";
}

1 个答案:

答案 0 :(得分:1)

GetThreadTimes()将为您提供正确的值。问题是它在FILETIME结构中给出了它。您必须将FILETIME结构转换为易于向用户显示的时间。您可以使用API​​ FileTimeToSystemTime执行此操作:

SYSTEMTIME stUTC;        
FileTimeToSystemTime(&f4, &stUTC);
std::cout<<"Thread1: Hour:"<<stUTC.wHour<<" Min:"<<stUTC.wMinute<<" Sec:"<<stUTC.wSecond<<" millSec:"<<stUTC.wMilliseconds<<std::endl;

在我的机器中,输出为:Thread1: Hour:0 Min:0 Sec:3 millSec:0

请忽略年份\天详细信息,因为FILETIME包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量。

不要忘记添加kernerl时间和用户时间来获得总时间。

相关问题