-자식 쓰레드를 생성하여 child Event 발생 시 소요되는 시간 측정하는 프로그램이다.
#include <iostream>
#include <windows.h>
#include <winbase.h>
using namespace std;
HANDLE hResumeMain;
HANDLE hResumeChild;
LARGE_INTEGER loop_count;
LARGE_INTEGER freq; //counts per sec
LARGE_INTEGER time1; //counts
LARGE_INTEGER time2; //counts
LARGE_INTEGER total_time; //counts
BOOL mission_accomplished = false;
DWORD WINAPI ChildThreadRoutine( LPVOID lpParam );
int main(int argc, char* argv[])
{
loop_count.QuadPart = 0; //변수 초기화
total_time.QuadPart = 0;
QueryPerformanceFrequency(&freq); //주파수 측정 함수
HANDLE myProc = GetCurrentProcess(); //현재 프로세스의 핸들 저장
SetPriorityClass(myProc, REALTIME_PRIORITY_CLASS);
//우선순위 변경.실시간 우선순위로.
//CreateEvent 함수는 네개의 인자를 가지는데,
//첫번째는 생성된 핸들을 자식 프로세스가 상속받도록 하겠느냐
//두번째는 이벤트를 자동으로 리셋시킬것이냐 아니냐
//세번째는 초기값이 시그널이냐 아니냐
//네번째는 이벤트의 이름을 스트링으로 주는것으로
//각각의 이벤트 객체를 생성
hResumeMain = CreateEvent(NULL, FALSE, FALSE, NULL);
hResumeChild = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE hChild = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)ChildThreadRoutine,NULL, 0, NULL); //자식 쓰레드 생성
SetThreadPriority(hChild, THREAD_PRIORITY_TIME_CRITICAL);
//자식 쓰레드의 우선순위 최상위로 상승시킴.
while(!mission_accomplished) //초기값에 따라 while문 실행 여부결정
//초기값이 false 이므로 수행.
{
QueryPerformanceCounter(&time1); //timer1 시간 측정
//child 이벤트 발생 ->ChildThreadRoutine() 호출
SetEvent(hResumeChild); //hResumeChild 객체를 signaled 상태로 만듬
WaitForSingleObject(hResumeMain, INFINITE); //이벤트의 발생대기.
}
//초당 주파수 출력
cout << "counts per second: " << freq.QuadPart << endl
<< "total counts: " << total_time.QuadPart << endl // 응답시간의 합
<< "total ?? : " << loop_count.QuadPart << endl //child이벤트발생 수
<< "avg ?? time: " //평균 반응 시간을 micro second(us) 단위로 출력
<< (double)total_time.QuadPart / loop_count.QuadPart * 1000000 / freq.QuadPart<< "us" << endl;
while (getchar() != 'E')
continue;
return 0;
}
DWORD WINAPI ChildThreadRoutine( LPVOID lpParam )
{
while(!mission_accomplished)
{
WaitForSingleObject(hResumeChild, INFINITE); //이벤트의 발생대기.
QueryPerformanceCounter(&time2); //timer2의 시간 측정
total_time.QuadPart += (time2.QuadPart - time1.QuadPart); //총 반응 시간를 구한여 저장.
loop_count.QuadPart++; //카운트 증가
if (total_time.QuadPart >= freq.QuadPart) //조건(총반응시간 >= 빈동수) 부합 시 종료
mission_accomplished = TRUE;
SetEvent(hResumeMain); //이벤트 발생
}
return 0;
}
step1> 초당 주파수를 구하고 현재 프로세스 우선순위를 실시간으로 변경하고 프로세스 핸들을 얻는다.
step2> 자식 쓰레드를 생성하여 우선순위를 높여준다.
step3> main()에서 현재시간을 측정하고 child Event 발생한다.
step4> 이 때 시간을 재측정하여 이전시간과의 차이(자식 쓰레드 응답시간)를 구한다.
step5> 여러 차례 측정하여 합을 구한다. 이 값이 1단계에서 구한 초당 주파수 보다 크면 주파수, 응답시간, child event 발생횟수, 평균반응속도 출력한 후 프로그램을 종료한다.
TCP/UDP Network Protocol (0) | 2008.11.02 |
---|
S | M | T | W | T | F | S |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |