-
#define _CRT_SECURE_NO_DEPRECATE
-
-
#include "windows.h"
-
-
typedef struct SumInfo
-
{
-
int a, b, s;
-
}SUMINFO, *PSUMINFO;
-
-
DWORD WINAPI Sum(void* p);
-
HANDLE g_hConsoleOut;
-
-
void writeString(LPCTSTR lpszFormat, ...)
-
{
-
char str[1024] = { 0 };
-
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[1024];
-
DWORD dwThreadId, dwExitCode;
-
//기본 콘솔 출력 버퍼 오브젝트 핸들을 얻는다.
-
g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
-
if (g_hConsoleOut == INVALID_HANDLE_VALUE)
-
{
-
return;
-
}
-
-
writeString(TEXT("*** 예제 [Thread] WIN32 API를 이용한 쓰레드 예제 ***\n"));
-
-
// 기본 힙 메모리 오브젝트를 이용해서 메모리 할당
-
PSUMINFO psi = (PSUMINFO)HeapAlloc(GetProcessHeap(), 0, sizeof(SUMINFO));
-
psi->a = 1;
-
psi->b = 100;
-
psi->s = 0;
-
-
HANDLE h = CreateThread(
-
NULL, //보안속성 SECURITY_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);
-
}
-
-
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결과%d\n"), psi->s);
-
return psi->s;
-
-
}
-