티스토리 뷰
CWinThread* pThread = NULL;
static volatile bool isThreadRunning;
//////////////////////////////////////////////////////////////////////////
//
// AfxbeginThread에 등록되는 함수.
// 반드시 static (전역)함수여야 한다.
//
//////////////////////////////////////////////////////////////////////////
UINT MyThread(LPVOID lpParam)
{
MyClass* pClass = (MyClass*) lpParam;
int iReturn = pClass->ThreadFunction();
return 0L;
}
//////////////////////////////////////////////////////////////////////////
//
// Thread 생성 함수
//
//////////////////////////////////////////////////////////////////////////
void MyClass::CreateThread(UINT _method)
{
if(pThread!=NULL)
{
AfxMessageBox("thread가 이미 실행중입니다!");
return;
}
pThread = AfxBeginThread( MyThread, this,
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if(pThread == NULL)
cout<<"Fail to create camera thread!!";
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();
}
//////////////////////////////////////////////////////////////////////////
//
// Thread 소멸 함수
//
//////////////////////////////////////////////////////////////////////////
bool MyClass::DestroyThread(void)
{
if(NULL != pThread)
{
DWORD dwResult = ::WaitForSingleObject(pThread->m_hThread,INFINITE);
if(dwResult == WAIT_TIMEOUT)
cout<<"time out!"<<endl;
else if(dwResult == WAIT_OBJECT_0)
cout<<"Thread END"<<endl;
delete g_pThread;
pThread = NULL;
}
return true;
}
//////////////////////////////////////////////////////////////////////////
//
// Thread 함수
//
//////////////////////////////////////////////////////////////////////////
int MyClass::ThreadFunction( void )
{
while ( isThreadRunning )
{
// Check to see if the thread should die.
if( !isThreadRunning )
break;
// 소스 입력...
//
}
return returnValue;
}
[함수 설명]
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
// - msdn :http://msdn.microsoft.com/ko-kr/library/s3w9x78e(v=VS.80).aspx
thread를 생성할 때 사용한다.
pfnThreadProc : 함수의 주소가 들어간다. (반드시 정적함수여야 한다.)
pParam : 스레드로 실행할 함수에 인자로 전달되는 값으로 보통은 주소가 된다.
nPriority: 스레드의 우선순위를 지정한다. 보통으로 사용하기 위해서는 THREAD_PRIORITY_NORMAL 을 쓴다.
nStackSize: 스레드의 최대 스택 크기를 지정한다. 0을 넣으면 프로세스 생성시 최초 실행되는 스레드의 크기와 같게
할당된다.
dwCreateFlags: 스레드를 생성한 다음 즉시 실행할 것인지 아니면 대기했다가 실행할 것인지를 명시한다.
CREATE_SUSPENDED를 사용하면 스레드는 실행되지 않고 대기하게 되며 이 경우 ResumeThread()
함수를 소출하여 스레드를 시작할 수 있다.
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
// msdn - http://msdn.microsoft.com/ko-kr/library/aa450988
::WaitForSingleObject() 함수는 특정 object의 상태가 설정될 때 까지 현재 thread의 실행을 멈추는 역할을 한다. dwMilliseconds 시간만큼 기다리며 이 시간안에 object의 상태가 변화되면 값을 반환한다.
이때 반환값으로 WAIT_TIMEOUT이 반환되면, 기다리는 동안 object의 상태가 설정되지 않아서 그냥 반환했다는 것을 의미하며 WAIT_OBJECT_0를 반환했다면 object의 상태가 설정되어서 반환했다는 것을 의미한다.
여기서 hHandle에는 object의 핸들이나 프로세스의 핸들과 같은 각종 핸들이 들어간다.
[주의]
thread를 종료할 때 thread 함수 안에서 DestroyThread() 함수를 호출하면 thread가 정상적으로 종료 되지 않는다. (무한정 기다리게 되거나..)
그러므로 DestroyThread 함수는 반드시 thread 함수 밖에서 호출 해 줘야한다. (따로 종료 버튼을 만들거나, 메시지 방식 등..)
[출처] [MFC] mfc thread 사용하기 |작성자 hextrial
'Computer > MFC' 카테고리의 다른 글
[MFC] 윈도우 핸들( HWND ) 얻기 (0) | 2013.07.10 |
---|---|
[MFC] 트레이 아이콘(Tray Icon)의 생성 및 사용 & 사용자 정의 메시지 (0) | 2013.07.09 |
MFC 프로그램 배포용으로 생성하기 (0) | 2013.07.08 |
CString 사용 예제 (0) | 2013.07.06 |
MFC로 프로그래밍 하면서 printf 함수를 사용 (0) | 2013.07.05 |