2009-03-16 4 views
1

MFC/Win32를 사용하여 CPU 내부의 스레드가 소비 한 실제 시간을 확인할 수있는 방법이 있습니까? 실제 시간으로 말하자면 쓰레드가 "Running"이 아닌 다른 주에서 보낸 시간을 계산하고 싶지는 않습니다. Win32 SDK에서 GetThreadTimes() 메서드를 시도했지만 적절한 값을 얻을 수 없습니다. 스레드 우선 순위를 THREAD_PRIORITY_NELMAL 대신 THREAD_PRIORITY_BELOW_NORMAL로 설정하면 ThreadPriority를 ​​예약 할 때의 효과, 즉 차이점이 얼마나되는지 확인하고자하므로이 작업을 수행하고 싶습니다.다중 스레드 환경에서 각 스레드 프로파일 링

#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"; 
} 
+0

GetThreadTimes()는이 작업을 수행하는 방법이며, 호출하는 방법과 올바른 값을 가져 오지 않음을 나타내는 경우 도움이됩니다. – Michael

+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; 

출력했다 : FILETIME 100 나노초 간격의 수를 나타내는 64 비트 값을 포함로 Thread1: Hour:0 Min:0 Sec:3 millSec:0

년의 \ 일 세부 사항을 무시하십시오 1601 년 1 월 1 일 이후 (UTC).

kernerl 시간과 사용자 시간을 합하여 총 시간을 얻는 것을 잊지 마십시오.