티스토리 뷰

Visual Studio 2012 사용


스레드(Thread)를 활용해보자. 스레드 한개를 미리 생성해서 대기시켜놓고, Run명령을 통해 작동/중지시키고 Stop명령을 통해 스레드를 종료하는 방법까지 다뤄본다.


1. 선언


// header.h
	CWinThread *m_pThread;
	HANDLE hThread;
	bool m_bRun, m_bStop;
	static UINT RunThread(LPVOID pParam);
//...


m_pThread을 통해 스레드를 시작하고, hThread에 해당 핸들을 넣는다.

m_bRun, m_bStop으로 스레드를 시작하거나 종료하는 구문을 넣는다.

RunThread는 스레드 시작시 사용할 함수 원형이다.


2. 정의


1) OnInitDialog


// main.cpp
BOOL 클래스이름::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	...

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	if(m_pThread==NULL)
	{
		m_pThread = AfxBeginThread(RunThread, this);
		hThread = m_pThread->m_hThread;
		m_bStop=false;
		m_bRun=false;
		if(!m_pThread)
		{
			AfxMessageBox(_T("Thread could not be created,"));
			return;
		}
	}
	
	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
//...


OnInitDialog 함수에서 스레드를 시작하는 루틴을 넣는다. 스레드의 핸들, 변수 초기화 등등을 진행한다.

AfxBeginThread를 통해 스레드를 시작하였고, 파라미터로 스레드 함수는 RunThread를 명시하고, this를 통해 메인클래스의 주소값을 넘겨준다.


2) 대화상자 소멸시의 스레드 처리


// main.cpp
void 클래스이름::OnDestroy()
{
	CDialogEx::OnDestroy();
	
	if(m_pThread!=NULL)
	{
		m_bStop=true;
		m_pThread = NULL;
	}
}
//...


대화상자에서 WM_DESTROY 메시지 처리기를 추가하여 위와 같이 코딩한다.

대화상자 종료시 스레드가 종료되지 않았다면 종료하는 루틴이다.

보통 CWinThread변수에 NULL을 넣으면 제거 된다는데 이상하게 안된다.

그래서 m_bStop을 활용하여 스레드 함수 내에서 종료하는 방법도 같이 포함한다.


3) 스레드 함수


// main.cpp
UINT 클래스이름::RunThread(LPVOID pParam)
{
	클래스이름 *g_pDlg = (클래스이름*)pParam;
	while(1)
	{
		if(g_pDlg->m_bRun==true)
		{
			//작동 함수
		}

		if(g_pDlg->m_bStop==true)
		{
			return 0;
		}
	}
	return 0;
}
//...


위의 AfxBeginThread(RunThread, this); 구문을 통하여 g_pDlg에 메인클래스 대화상자 포인터를 전달받는다.

전달받은 g_pDlg 포인터를 통해 메인클래스의 변수에 접근할 수 있게된다.

스레드는 while문 안에서 무한 루프 중이고

m_bRun에 true/false를 넣어 스레드를 작동/중지 시킬 수 있도록 구성한다.

m_bStop에 true를 넣음으로 return 명령을 통해 스레드를 종료시킨다.


댓글