2013-10-06 4 views
0

다음 코드에서 오류가 발생합니다.MFC 프로그래밍 : 컴파일 중 오류 : 스레드 코드 오류

DWORD WINAPI CMbPoll::testThread(LPVOID lpVoid) 
{ 
    DWORD dwWaitResult; 

    while(1) 
    { 
     dwWaitResult = WaitForSingleObject(ghSemaphore, INFINITE/*0L*/); 

     if (connectionSuccessful == 1) 
     { 
      staticConnectionStatus.ShowWindow(FALSE); 
     } 
     else 
     { 
      staticConnectionStatus.ShowWindow(TRUE); 
     } 

     MessageBoxW(L"hi"); 
     switch (dwWaitResult) 
     { 
      case WAIT_OBJECT_0: 
       Read_One_t(pollSlaveId[0], pollAddress[0], 0); 
       temporaryCount++; 
       break; 
      case WAIT_TIMEOUT: 
       temporaryCount++; 
       break; 
      default: 
       break; 
     } 
    } 
} 

오류는 다음과 같습니다
I.
오류 C2228
staticConnectionStatus.ShowWindow(FALSE);에서 : 클래스/구조체/노동 조합

II가 있어야합니다 '.ShowWindow'의 왼쪽. MessageBoxW(L"hi");
오류 C2352에서
: '하여 CWnd :: MessageBoxW': 비 정적 멤버 함수

의 불법 전화 나는 이러한 오류가 나타나는 이유를 이해할 수 없습니다입니다.

testThread에 대한 나의 선언은 다음과 같습니다

static DWORD WINAPI testThread(LPVOID lpVoid); 

staticConnectionStatus은 MFC에서 양식에 정적 텍스트 레이블 멤버 변수입니다.

DDX_Control(pDX, IDC_STATIC_CONFIG6, staticConnectionStatus); 

감사합니다.

답변

1

왜냐하면 testThread는 정적이기 때문입니다. 정적 메소드는 클래스의 인스턴스 변수에 액세스 할 수 없습니다.

솔루션 (이 최근에 많이왔다) testThread는 비 정적 확인하고 스레드를 시작하고 CreateThread에 전달 된 this 포인터를 사용, CMbPoll::testThread를 호출하는 기능을 호출을 다시 사용하는 것입니다.

DWORD WINAPI thread_starter(LPVOID lpVoid) 
{ 
    return ((CMbPoll*)lpVoid)->testThread(); 
} 

CreateThread(..., thread_starter, this, ...); 

나는 다음 CMbPoll 개체의 주소로 this을 교체하지 않을 경우 당신이하는 CMbPoll 방법 코드에서 스레드를 시작하는 것이 있으리라 믿고있어.

+0

정확한 답변을 주셔서 대단히 감사합니다. – Jay