어제 _beginthreadex()함수를 호출하다가 이런일이 있었다. 예를 들면 대충 이러한 상황이였다.
class ex_Class //예제 클래스
{
private:
unsigned WINAPI ThreadProc(LPVOID lParam) //스레드를 위한 함수
{
//코오드
}
void TestFunction();
}
void ex_Class::TestFunction()
{
_beginthreadex(NULL,0,ThreadProc,...);//스레드 생성
}
이러니 _beginthreadex부분에서 컴파일 에러가 났다. 이유는 ThreadProc가 올바르지 않는 호출이라고..
처음에는 왜 그런지 몰라서 한참 헤매다가 나중에 겨우 이유를 찾았다.(당시에 인터넷도 안되고 해서 로컬 MSDN으로 한참 고생했다.)
우선 ThreadProc는 &ex_Class:ThreadProc같은 형태로 인자를 넘겨야 한다. ex_Class의 멤버함수이므로 접근 한정자를 붙여 주고 포인터이므로 &를 붙여 준다.
다음으로ThreadProc는 static으로 설정해야 한다. 함수 포인터의 호출이기 때문에 어느 한 객체에 소속되지 않게 하기 위해서 static으로 선언해야 한다. 이때문에 함수 내에서 멤버의 접근을 하기 위해서는 다음과 같은 방식으로 접근하여야 한다.
static unsigned WINAPI ThreadProc(LPVOID lParam)
{
ex_Class *cls = (ex_Class*)lParam;
cls->(멤버) 접근;
}
이는 꼭 스레드호출만이 아니라 함수포인터와 관련된 부분에서 해야 하는 것이다. 이런 상황에서 이런 오류를 만나서 예시가 이렇게 되었을뿐, 다른 상황에서도 마찬가지이다.
으흠... 아직 배우고 공부해야 할게 많다.
class ex_Class //예제 클래스
{
private:
unsigned WINAPI ThreadProc(LPVOID lParam) //스레드를 위한 함수
{
//코오드
}
void TestFunction();
}
void ex_Class::TestFunction()
{
_beginthreadex(NULL,0,ThreadProc,...);//스레드 생성
}
이러니 _beginthreadex부분에서 컴파일 에러가 났다. 이유는 ThreadProc가 올바르지 않는 호출이라고..
처음에는 왜 그런지 몰라서 한참 헤매다가 나중에 겨우 이유를 찾았다.(당시에 인터넷도 안되고 해서 로컬 MSDN으로 한참 고생했다.)
우선 ThreadProc는 &ex_Class:ThreadProc같은 형태로 인자를 넘겨야 한다. ex_Class의 멤버함수이므로 접근 한정자를 붙여 주고 포인터이므로 &를 붙여 준다.
다음으로ThreadProc는 static으로 설정해야 한다. 함수 포인터의 호출이기 때문에 어느 한 객체에 소속되지 않게 하기 위해서 static으로 선언해야 한다. 이때문에 함수 내에서 멤버의 접근을 하기 위해서는 다음과 같은 방식으로 접근하여야 한다.
static unsigned WINAPI ThreadProc(LPVOID lParam)
{
ex_Class *cls = (ex_Class*)lParam;
cls->(멤버) 접근;
}
이는 꼭 스레드호출만이 아니라 함수포인터와 관련된 부분에서 해야 하는 것이다. 이런 상황에서 이런 오류를 만나서 예시가 이렇게 되었을뿐, 다른 상황에서도 마찬가지이다.
으흠... 아직 배우고 공부해야 할게 많다.