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 하는 것과 비슷하다고 보시면 되겠네요.

 

아래는 적용해본 예 입니다.

 



반응형

+ Recent posts