멀티 쓰레드의 시작!

로딩 쓰레드

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 에 옵션 넣어줘야 함. 플레그에 (장치 초기화쪽)