0

私はおそらく数年間あまりコーディングしていませんでした。私が持っていたアイデアのために、C++で本当に基本的なスレッドマネージャーを作りたかったのです。このエラーが発生する問題が発生しました:

ThreadManager.cpp:49:37:エラー:'ThreadManager ::updateLoop'をタイプ'DWORD(ThreadManager ::)(LPVOID){aka long unsigned int(ThreadManager ::)(void *)}'からタイプ'LPTHREAD_START_ROUTINEに変換できません{別名longunsignedint(attribute((stdcall)))(void)} '

それでも、私はそれを修正しようとする方法がわかりません。これが私のコードです。フォーマットを使用してここに貼り付ける方法がわかりませんでした。各行に4つのスペースが必要だと書かれていましたが、時間がかかるようだったので、ペーストビンに入れました。

ThreadManager.cpp: http: //pastebin.com/2bL3mTqv

ThreadManager.h: http: //pastebin.com/7xETj5BK

私が言ったように、私は長い間あまりプログラムをしていませんでした、そして私は私が覚えているものでそれに戻ろうとしています、それでどんな助けもいただければ幸いです。

4

1 に答える 1

0

コメントは基本的なことを述べていますが、ここで詳しく説明します。呼び出しが通常の関数を期待している場合、クラスにメソッドを渡すことはできません。あなたが望むことをするために、私は次のことをします:

// New Function
void threadMain(void* classPointer)
{
    ThreadManager* realClass = (ThreadManager*)classPointer;
    realClass->updateLoop();
}

ThreadManager::ThreadManager(int max)
{
    // Assign maxThreads to max value
    maxThreads = max;

    // Start updateThread, and let it run updateLoop() until terminated
    updateThread = CreateThread(
                                NULL,       // default security attributes
                                0,          // use default stack size
                                threadMain, // thread function name
                                this,          // argument to thread function
                                0,          // use default creation flag
                                NULL);      // ignore thread identifier

    // Check the return value for success
    // If failed, exit process.
    if (updateThread == NULL) {
        ExitProcess(3);
    }      
}

追加の引数が必要なことがわかったので、おそらく std::tuple を使用して、「this」ポインターと実際に必要な追加の引数を渡します。

以上のことをすべて述べたので、本当に必要でない限り、win32固有の呼び出しではなく、他の人のアドバイスを受けてstd::threadなどを使用してください。

于 2013-01-06T23:56:57.900 に答える