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: '.ShowWindow' の左側にはクラス/構造体/共用体が必要です
staticConnectionStatus.ShowWindow(FALSE);

Ⅱ.
エラーC2352 MessageBoxW(L"hi");
: 'CWnd::MessageBoxW': 非静的メンバー関数の不正な呼び出し

これらのエラーが表示される理由がわかりません。

私の宣言testThreadは次のとおりです。

static DWORD WINAPI testThread(LPVOID lpVoid);

staticConnectionStatusMFC のフォームの静的テキスト ラベルのメンバー変数です。

DDX_Control(pDX, IDC_STATIC_CONFIG6, staticConnectionStatus);

前もって感謝します。

4

1 に答える 1

1

これは、testThread が静的であるためです。静的メソッドは、クラスのインスタンス変数にアクセスできません。

解決策 (これは最近よく出てきます) は、testThread を非静的にし、コールバック関数を使用してスレッドを開始し、渡されCMbPoll::testThreadたポインターを使用してを呼び出すことです。thisCreateThread

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

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

メソッド内のコードからスレッドを開始すると仮定しています。CMbPollそうでない場合は、オブジェクトthisのアドレスに置き換えCMbPollます。

于 2013-10-06T11:24:18.823 に答える