Программирование MFC: ошибка при компиляции: ошибка в коде потока

0

Я получаю ошибки в следующем коде.

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);

Заранее спасибо.

Теги:
mfc
static-methods

1 ответ

1
Лучший ответ

Это потому, что testThread является статическим. Статический метод не может получить доступ к переменным экземпляра класса.

Решение (появилось много недавно) заключается в том, чтобы сделать testThread нестатичным и использовать функцию обратного вызова для запуска потока и вызвать CMbPoll::testThread, используя this указатель, переданный CreateThread.

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

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

Я предполагаю, что вы запускаете поток из кода в CMbPoll методе, если нет, то замените this с адресом вашего CMbPoll объекта.

  • 0
    Большое спасибо за точный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню