Thread example code. - Thread03
//------------------------------------------------------------------------------
// WIN32 API를 이용한 스레드 예제 - 시작
//------------------------------------------------------------------------------
#include <windows.h>
#define ONEK 1024
typedef struct _SumInfo
{
int a, b, s;
}SUMINFO, *PSUMINFO; // a 에서 b까지의 합을 s에 저장
DWORD WINAPI Sum(void* p); // 스레드 함수
HANDLE g_hConsoleOut; // 콘솔 화면 출력을 위한 핸들
void WriteString(LPCTSTR lpszFormat, ...) // 매개변수(...)의 처리 방법으로 매개변수 리스트 va_list를 사용
{
char str[ONEK];
va_list argList; // 매개변수 리스트
DWORD dwNumberOfBytesWritten;
va_start(argList, lpszFormat); // 매개변수 리스트를 하나씩 꺼냄
wvsprintf(str, lpszFormat, argList);
va_end(argList); // 매개변수 리스트 사용 종료
WriteFile(g_hConsoleOut, str, lstrlen(str), &dwNumberOfBytesWritten, NULL);
}
void main()
{
char temp[ONEK];
DWORD dwThreadId, dwExitCode;
// 기본 콘솔 출력 버퍼 오브젝트의 핸들을 얻음
g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(g_hConsoleOut == INVALID_HANDLE_VALUE)
return;
WriteString(TEXT("*** 예제 [Thread03] WIN32 API를 이용한 스레드 예제 *** \n"));
// 기본 힙 메모리 오브젝트를 이용해서 메모리 할당
PSUMINFO psi = (PSUMINFO)HeapAlloc(GetProcessHeap(), 0, sizeof(SUMINFO));
psi->a = 1;
psi->b = 100;
psi->s = 0;
// 스레드 생성
HANDLE h = CreateThread(NULL, 0, Sum, psi, NULL, &dwThreadId);
// NULL, 보인속성 SECURYTI_ATTRIBUTES 구조체 포인터
// 0, 스레드가 실행도리 때 Commit상태의 스택 크기 설정
// Sum, 스레드 오브젝트가 실행할 함수 포인터
// psi, 스레드 함수에게 전달할 포인터. 일반적으로 데이터를 보냄
// NULL, 스레드 함수 실행 옵션
// &dwThreadId); 스레드 아이디를 리턴 받음
if(h==NULL) return;
// 스레드의 상태를 확인하여 종료될 때를 기다린다.
while (GetExitCodeThread(h, &dwExitCode))
{
if(dwExitCode != STILL_ACTIVE)
{
CloseHandle(h);
break;
}
else
{
// 대기하고 있는 동안 화면에 "."을 찍는다.
WriteString(TEXT("."));
Sleep(20);
}
}
// 메모리 할당해제
HeapFree(GetProcessHeap(), 0, psi);
}
// 스레드 함수: psi->a부터 psi->b까지의 합을 psi->s에 대입한다.
DWORD WINAPI Sum(void* p)
{
PSUMINFO psi = (PSUMINFO)p;
do // psi->a부터 psi->b까지의 합을 psi->s에 대입한다.
{
psi->s += psi->a;
Sleep(20);
} while (psi->a++ != psi->b);
WriteString(TEXT("\nSum Result: %d\n"), psi->s);
return psi->s;
}
//------------------------------------------------------------------------------
// WIN32 API를 이용한 스레드 예제 - 끝
//------------------------------------------------------------------------------
위의 예제 소스 코드에서 사용된
vwsprintf, WriteFile, GetStdHandle, HeapAlloc, CreateThread, GetExitCodeThread, HeapFree 등의
함수는 모두 WIN32 API 이다.
'◆ 무한한 가능성 > & Visual C/C++' 카테고리의 다른 글
Thread in C runtime library> example code. - Thread04 (0) | 2009.08.19 |
---|---|
Thread in C runtime library (다중스레드, Multi-Thread) (0) | 2009.08.19 |
Thread (0) | 2009.08.19 |
Kernel Object (0) | 2009.08.17 |
Safe String Reference (0) | 2009.06.23 |