2012-03-20 2 views
1

구조체를 매개 변수로 전달하려고합니다.AfxBeginThread의 매개 변수로서의 구조

글로벌 구조 : 메인 스레드에서

struct ThreadParams 
{ 
    HWND window; 
    LIB::ServiceContainer* mrt; 
}; 

: 클래스 외부

ThreadParams threadparams; 
threadparams.window = (HWND) GetSafeHwnd(); 
threadparams.mrt = m_rt; 

CWinThread* pthread1; 
pthread1 = (CWinThread*) AfxBeginThread(Thread1,(LPVOID)&threadparams,THREAD_PRIORITY_NORMAL,0,0,0); 

: 그것은 잘 컴파일하지만

UINT Thread1(LPVOID lp) 
{ 
ThreadParams* threadparams = (ThreadParams*) lp; 

    HWND hmainWindow = threadparams->window; 
LIB::ServiceContainer* m_rt = threadparams->mrt; 

} 

, 나는 런타임 오류가 발생합니다 (예기치 않은 오류입니다) 그리고 나는 포인터 m_rt가 엉망이라고 생각합니다. 명백한 실수가 있습니까?

+2

더 많은 호출 코드를 표시 할 수 있습니까? 스레드가 실행되는 동안'threadparams'가 파괴되면 스레드는 매달린 포인터를 갖습니다. – hmjd

답변

3
ThreadParams threadparams; 

참고 때 함수가 반환됩니다. 이런 경우, 다음 대신으로 new을 사용하여 새 인스턴스를 만들 : 존재 있도록,

ThreadParams * pthreadparams = new ThreadParams(); 

및 스레드에 전달조차 스레드 수익을 생성하는 기능을 경우. 물론, 작업이 끝나면 수동으로 삭제해야합니다.

2

대부분의 경우 다른 스레드에 할당 된 로컬 변수에 안전하게 액세스 할 수 없습니다. Thread1이 시작될 때까지, 구조는 이미 메인 쓰레드에서 범위를 벗어날 가능성이있다. 주 스레드에서 new 매개 변수를 할당하고 Thread1에서 완료 한 경우이를 삭제하는 등의 다른 방법을 찾아야합니다. 이 지역 변수, 그리고 스레드를 생성 한 후 반환 선언하는 기능의 경우 지역 변수가 파괴됩니다로서, 다음 스레드가 더 이상 존재하지 않는 개체를 참조하는 것이