Thread 생성과 응답속도

Posted 2008. 10. 8. 22:14 by MINOK

 

-자식 쓰레드를 생성하여 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 발생횟수, 평균반응속도 출력한 후 프로그램을 종료한다.


'Computer Engineering > Embedded System Archictecture' 카테고리의 다른 글

TCP/UDP Network Protocol  (0) 2008.11.02