Я получаю ошибки в следующем коде.
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;
}
}
}
Ошибки:
Я.
at staticConnectionStatus.ShowWindow(FALSE);
ошибка C2228: слева от '.ShowWindow' должен быть класс /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);
Заранее спасибо.
Это потому, что testThread является статическим. Статический метод не может получить доступ к переменным экземпляра класса.
Решение (появилось много недавно) заключается в том, чтобы сделать testThread нестатичным и использовать функцию обратного вызова для запуска потока и вызвать CMbPoll::testThread
, используя this
указатель, переданный CreateThread
.
DWORD WINAPI thread_starter(LPVOID lpVoid)
{
return ((CMbPoll*)lpVoid)->testThread();
}
CreateThread(..., thread_starter, this, ...);
Я предполагаю, что вы запускаете поток из кода в CMbPoll
методе, если нет, то замените this
с адресом вашего CMbPoll
объекта.