오늘은 간단한 C++ 프로그래밍 기법에 대해 하나 써볼까 합니다.

 

간단한 기교를 부려볼 겸 클래스의 멤버함수를 쓰레드 함수로 작성하는 방법을 배워 보도록 하겠습니다.

(간단히 쓰레드 사용법도 배우고 일석이조! 야호! )

 

아직까진 그런 적은 없지만, 쓰레드를 돌릴 때 간간히 멤버함수를 쓰레드 함수로 제작하고플 때가 있더군요.

혹, 그런 분들을 위해 알려 드리겠습니다.

 

 class TestClass {

 

     INT B;

 

     VOID TestFunction( INT A ) { B = A };                       //이 함수를 쓰레드로 돌리고자 합니다.

     VOID Start();                                                          //이 함수에서 TestFunction을 호출하지요.

 

};

 

 Start() 멤버 함수에서 TestFunction()을 쓰레드로 돌리고자 한다고 해보죠.

 

 VOID TestClass ::Start() {

 

       HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunction, NULL, NULL, NULL );

       // ........ 무엇가의 작업을 하고.

 

       WaitForSingleObject( hThread, INFINITE );

       CloseHandle( hThread );

}

  

물론 안됩니다. 쓰레드로 돌아갈  함수는 정적으로 선언되어야 하며 정적 함수여야 하죠. 따라서,

 
 class TestClass {

 

     static VOID WINAPI TestFunction( INT A );                    // 이제 원래 의도대로 이 함수를 정적 함수로 제작합니다.

     VOID Start();

 

};

 

역시 물론 안됩니다. 직접 닥쳐보시면 알겠지만, 우리가 돌리고자 했던 TestFunction 함수에서는 B라는 비정적 멤버를 참조하고 있습니다.

 

결국은 다른 방법을 찾아야 합니다.

 

 class TestClass {

 

     VOID TestFunction( INT A );                                             //다시 원래대로 돌리고

     static VOID WINAPI TestFunctionThread( LPVOID );            //대신 쓰레드가 돌아갈 정적 함수를 만듭니다.

     VOID Start();

 

};

 

VOID Start() {

 

       HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunctionThread, this, NULL, NULL );

       // ........ 무엇가의 작업을 하고.

 

       WaitForSingleObject( hThread, INFINITE );

       CloseHandle( hThread );

 

}

 

VOID WINAPI TestFunctionThread( LPVOID p ) {

      (  (TestClass* ) p )->TestFunction( 3 );

}

 

 

자, 위 예를 통해 해결했습니다. 포인터. 즉 동적 호출을 통해서 정적 멤버 함수를 호출하였습니다.

 

TestFunction의 인자 값도 동적으로 주고 싶다면, 

 

 struct Arg {

      TestClass* p;

       INT A;

};

 

VOID Start() {

 

        Arg arg = { this, 3 };

 

       HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &TestFunctionThread, &arg, NULL, NULL );

       // ........ 무엇가의 작업을 하고.

 

       WaitForSingleObject( hThread, INFINITE );

       CloseHandle( hThread );

 

}

 

VOID WINAPI TestFunctionThread( LPVOID p ) {

      Arg* pArg = ( Arg* ) p;

      pArg->p->TestFunction( p->A );     

}

 


'게임개발공부 > 무작정퍼오기' 카테고리의 다른 글

컨테이너 종류 복습  (0) 2013.12.21
텍스처 아틀라스  (0) 2013.12.20
assert 사용법  (0) 2013.11.27
<소켓 서버> sockaddr  (0) 2013.11.25
무작정 쳐보자 <CSTREAM>  (0) 2013.11.24
Posted by JJOREG