MFC编程:编译时出错:线程代码中的错误

时间:2013-10-06 11:04:58

标签: c++ mfc static-methods

我在以下代码中遇到错误。

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

提前谢谢你。

1 个答案:

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