我在以下代码中遇到错误。
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.
在staticConnectionStatus.ShowWindow(FALSE);
错误C2228:'。ShowWindow'的左边必须有class / struct / union
II。
在MessageBoxW(L"hi");
错误C2352:'CWnd :: MessageBoxW':非静态成员函数的非法调用
我无法理解为什么会出现这些错误。
我对testThread
的声明是:
static DWORD WINAPI testThread(LPVOID lpVoid);
staticConnectionStatus
是MFC中表单上静态文本标签的成员变量。
DDX_Control(pDX, IDC_STATIC_CONFIG6, staticConnectionStatus);
提前谢谢你。
答案 0 :(得分:1)
因为testThread是静态的。静态方法无法访问类的实例变量。
解决方案(最近出现了很多)是使testThread非静态,并使用回调函数启动线程并使用传递给CMbPoll::testThread
的{{1}}指针调用this
CreateThread
。
DWORD WINAPI thread_starter(LPVOID lpVoid)
{
return ((CMbPoll*)lpVoid)->testThread();
}
CreateThread(..., thread_starter, this, ...);
我假设您从CMbPoll
方法中的代码启动线程,如果没有,请将this
替换为CMbPoll
对象的地址。