2013.07.09 12:40


 

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


신고


Posted by injunech

티스토리 툴바