2013.07.10 21:53



 CWnd *pWnd = AfxGetMainWnd();
 HWND hWnd = pWnd->m_hWnd;


인스턴스 정보는 아래와 같은 방법으로 쉽게 얻어진다.

HINSTANCE hInst = AfxGetInstanceHandle();



Posted by injunech
2013.07.09 17:07



BroadcastReceiver.cpp


BroadcastSender.cpp


'Computer > CPP' 카테고리의 다른 글

함수 포인터 및 클래스 멤버함수의 함수포인터화  (0) 2015.09.02
멀티바이트와 유니코드  (0) 2013.07.27
BroadCasting 참고 코드  (0) 2013.07.09
Virtual Key Code  (0) 2013.07.06
키보드 이벤트 처리하기  (0) 2013.07.05
Visual Studio 2012 단축키  (0) 2013.07.05


Posted by injunech
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