2013-10-06 77 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; 
     } 
    } 
} 

错误是:

staticConnectionStatus.ShowWindow(FALSE);
错误C2228:左 '.ShowWindow' 必须有类/结构/联合

II。
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非静态的,并使用一个回调函数来启动线程,并调用CMbPoll::testThread,使用this指针传递给CreateThread

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

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

我假设你从代码启动线程的方法CMbPoll,如果没有的话你CMbPoll对象的地址替换this

+0

非常感谢您的确切答案。 – Jay