◆ 무한한 가능성/& Visual C/C++

Thread example code. - Thread03

치로로 2009. 8. 19. 14:53

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