5

CreateThread 関数を使用して、C++ でC# BackgroundWorkerのようなクラスを作成しました。私のコード:

BackgroundWorker.h:

class BackgroundWorker
{
    private :
        HANDLE _threadHandle;
        unsigned int _threadCallcounter;
        DWORD _threadID;
    public:
        BackgroundWorker();
        ~BackgroundWorker();
        virtual DWORD WINAPI Function(LPVOID vpPram);
}

BackgroundWorker.cpp:

#include "BackgroundWorker.h"
void BackgroundWorker::DoWork()
{
    this->_threadHandle = CreateThread(NULL,
        0,this->Function,&this->_threadCallcounter,
        0, &this->_threadID); // !!!***This part throws an error***!!!
}

次に、BackgroundWorker から派生した別のクラスを作成しました。

ListenThread.cpp:

class ListenThread :public BackgroundWorker
{
    DWORD WINAPI Function(LPVOID vpPram)
    {
        //DO somthing...
        return 0;
    }
};

しかし、その行は私に次のエラーを与えます:

非標準構文; 「&」を使用してメンバーへのポインタを作成します

4

2 に答える 2

3

CreateThread が期待する関数ポインターには、次の署名が必要です。

DWORD WINAPI ThreadProc(LPVOID lpParameter);

メンバー関数を作成すると、最初の引数として非表示の「this」パラメーターが取得されるため、次のようなものを暗黙的に宣言します。

DWORD WINAPI ThreadProc(BackgroundWorker *this, LPVOID lpParameter);

this ポインターを省略する静的メンバー関数を作成し、スレッド ルーチン内でそのポインターが必要な場合は、それを void * パラメーターとして渡します。

于 2016-03-09T10:04:37.097 に答える