멀티 쓰레드의 시작!
로딩 쓰레드→
class CLoading : public CBase
{
private:
//생성자
//복사 생성자
//소멸자
public:
static CLoading* Create();
Hresult Ready_Loading();
_uint Loading_Stage();
LOADING_ID Get_LoadingID()const;
_bool Get_Finished()const;
CRITICAL_SECTION* Get_Crt() {return &m_Crt;} //스태틱 함수는 멤버 변수를 사용할 수 없어서
public:
enum class LOADING_ID{ LOADING_STAGE,LOADING_BOSS};
public:
//리턴 값은 반드시 언사인드 인트
static unsigned int __stdcall Thread_Main(void* pArg); //쓰레드 함수는 전역에서 접근 가능해야함 -> 정확하게는 한 객체에 종속적이게 진행될 수 없음
//쓰레드를 통해 무엇을 할지 모르니까 일단 보이드 포인터를 사용 중임.
private:
LPDIRECT3DDEVICE m_pGraphicDev;
HANDLE m_hThread;
_bool m_bFinish;
LOADING_ID m_LoadingID;
CRITICAL_SECTION m_Crt; //크리티컬 섹션 자료형
private:
Free();
};크리티컬 섹션 - > 임계 영역을 제한하는 수법의 기법 쓰레드가 돌고 있는 동안에, 다른 쓰레드의 사용 권한은 막아버리는 방식
멀티 쓰레드 필수 헤더파일
#include <Windows.h>
#include <process.h>CPP에서 중요한 부분
InitiailizeCriticalSection(&m_Crt);
m_hThread = (HANDLE)_beginthreadex(
//1. 보안 설정 -> 널값,
//2. 스택 사이즈 -> 0 : 필요한 만큼 사용
//3. 스타트 어드레스 -> 해당 쓰레드를 구동하는 함수(thread_main)
//4. arg리스트 -> 이 함수를 통해서 가공하고자 하는 변수 우리는는 this
//5. init flag -> 0 개수를 의미 (몇 개의 쓰레드를 만들지)
//6. null -> DWORD 타입의 배열의 주소. (그 번호를 저장할 배열)
);
DeleteCriticaleSection(&m_Crt);
쓰레드 메인에서 - > 매개 변수 보이드를 로딩 타입으로 형변환 해줌.
엔터크리티컬섹션이라는 함수 사용함(임계 영역 진입)(겟 함수 통하여 크리티컬 섹션 반환하여 넣어줌)
로딩 아이디 따른 분기
=> 로딩forStage함수 사용함.
그리고 쓰레드 종료를 반환해줌
여기서 엔드 쓰레드 해준다.
_endThreadex(0)
그런데 원래 우리가 정상적으로 0을 반환하면 os 단에서 자동으로 저 함수가 호출이 되어 종료됨.
리브크리티컬섹션이라는 함수 떠남(임계 영역 떠남)(겟 함수 통하여 크리티컬 섹션 반환하여 넣어줌)
Free(){
waitForSingleObject(m_hThread, INFINITE); //쓰레드 종료까지 기다리라.
//waitForMultipleObject()//여러개의 쓰레드를 사용
CloseHandle(m_hThread); // 멀티 쓰레드의 종료가 아닌 핸들의 개방을 삭제.
DeleteCriticalSection(&m_Crt);
Safe_Release(m_pGraphicDev);
}실사용
//ready
m_pLoading = CLoading::Create();
//update
if(true = m_pLoading->Get_Finished()){
//씬 전환 진행
}
DevCaps 에 옵션 넣어줘야 함. 플레그에 (장치 초기화쪽)