http://cafe.naver.com/jcga/1323
멀티 쓰레드를 사용하지 않고 메쉬 오브젝트 같은 리소스들를 로드하게 되면, 그 리소스에 대한 로드가 완료되기 전에는 제어를 반환하지 않기 때문에 화면의 렌더링 처리가 불가능 하게 되는데, 이 때문에 사용자는 로드가 완료되기 전까지 검은 화면만 바라봐야 하는 문제가 있습니다. 이때 멀티쓰레드를 이용하면 이러한 심심한 화면을 조금 멋지게 바꿀 수 있습니다.
여기에서 사용되는 함수는 두가지입니다.
_beginthreadex()
_endthreadex()
이 두 함수는 각각 쓰레드 생성과 종료를 담당합니다. 쓰레드 생성용 함수는 이외에도 몇가지 존재하지만, C/C++에서 쓰레드를 사용할 경우에는 _beginthreadex() 를 이용해야 한다고 하네요. 좀더 자세한 내용은 “API 로 배우는 Windows 구조와 원리” 라는 책을 읽어보시면 알 수 있습니다.
사용법은 다음과 같습니다.
unsigned threadID;
HANDLE hHandle;
unsigned WINAPI LoadingThread(void * pArg)
{
if(pArg == "menuload")
{
// 처리
}
else if(pArg == "gameload")
{
// 처리
}
else if(pArg == "endingload")
{
// 처리
}
_endthreadex(0); // 종료
return 0;
}
void main()
{
...
while( pDevice->run() )
{
if( 메뉴 로드 )
{
hHandle = (HANDLE)_beginthreadex(NULL, 0, LoadingThread, "menuload", 0, &threadID);
CloseHandle(hHandle);
}
else if( 게임 로드 )
{
hHandle = (HANDLE)_beginthreadex(NULL, 0, LoadingThread, "gameload", 0, &threadID);
CloseHandle(hHandle);
}
else if( 게임 로드 )
{
hHandle = (HANDLE)_beginthreadex(NULL, 0, LoadingThread, "endingload", 0, &threadID);
CloseHandle(hHandle);
}
...
}
...
}
여기서
hHandle = (HANDLE)_beginthreadex(NULL, 0, LoadingThread, "endingload", 0, &threadID);
CloseHandle(hHandle);
부분의 쓰레드 생성 후 바로 CloseHandle() 을 호출하는 이유는 reference count 를 1 감소 시키기 위함 이라고 합니다. irrlicht 에서 add 후 drop 하는 것과 비슷하다고 보시면 되겠네요.
아래는 적용해본 예 입니다.
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
EnterCriticalSection 안에서 쓰레드가 죽는다면? (0) | 2012.12.27 |
---|---|
멀티쓰래드일때 멤버함수또한 동기화를 해줘야한다 (0) | 2012.12.26 |
[C++] 템플릿 기반 Critical Section 동기화 객체 (0) | 2012.12.24 |
InitializeCriticalSectionAndSpinCount (0) | 2012.12.24 |
CreateThread, _beginthread, _beginthreadex 에 대한 정리 (0) | 2012.12.23 |