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

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

二、
MessageBoxW(L"hi");
错误 C2352: 'CWnd::MessageBoxW' : 非法调用非静态成员函数

我无法理解为什么会出现这些错误。

我的声明testThread是:

static DWORD WINAPI testThread(LPVOID lpVoid);

staticConnectionStatus是 MFC 中窗体上的静态文本标签的成员变量。

DDX_Control(pDX, IDC_STATIC_CONFIG6, staticConnectionStatus);

先感谢您。

4

1 回答 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对象的地址。

于 2013-10-06T11:24:18.823 回答