1

C++ でスレッドを作成するのに少し問題があります。作成しようとすると、これら2つのエラーが発生します...

error C2661: 'std::thread::thread' : no overloaded function takes 2 arguments

error C3867: 'XboxControler::VibreateThread': function call missing argument list; use '&XboxControler::VibreateThread' to create a pointer to member

私はインターネットを検索しましたが、役に立ちませんでした。何が原因なのかよくわかりません。誰かが私が間違っている場所を指摘できることを望んでいました.

問題に関連するコードは...

これは現在、テスト目的でミリ秒に 1000 を使用しています。コントローラーの振動のスレッドを作成して、停止する前に一定の時間持続できるようにします。

void XboxControler::Vibrate(int leftVal, int rightVal)
{
    std::thread vibThread = std::thread(XboxControler::VibreateThread,vibStruct(leftVal, rightVal, 1000));
}

これは振動スレッドで、コントローラーの振動を開始および停止します。

void XboxControler::VibreateThread(vibStruct& vals){
    XINPUT_VIBRATION Viberation;

    ZeroMemory(&Viberation, sizeof(XINPUT_VIBRATION));

    Viberation.wLeftMotorSpeed = vals.leftVal;
    Viberation.wRightMotorSpeed = vals.rightVal;

    XInputSetState(_controllerNum, &Viberation);

    Sleep(vals.milliseconds);

    Viberation.wLeftMotorSpeed = 0;
    Viberation.wRightMotorSpeed = 0;

    XInputSetState(_controllerNum, &Viberation);
}

これは、スレッドのパラメーターで使用される構造体です。これは以前は存在せず、スレッドを適切に実行するためにのみ追加されました。これは、このコントローラー クラスのヘッダー ファイルでプライベートに宣言されます。

struct vibStruct{
    int leftVal;
    int rightVal;
    int milliseconds;
    vibStruct(int leftVal, int rightVal, int milliseconds){
        vibStruct::leftVal = leftVal;
        vibStruct::rightVal = rightVal;
        vibStruct::milliseconds = milliseconds;
    }
};

誰かが助けてくれることを願っています。振動を特定の時間持続させるためのより良い方法があるかもしれないと確信しています.問題。

編集1:

みんなの助けに感謝します。私は、機能する以下を作成するために言われたすべてを読みました...

& like がコンパイラによって指摘されたことを追加しましたが、それでもエラーが発生したため、最初は却下しました。Vibrate メソッドが実行されると破棄されない新しいスレッドを作成しました。

void XboxController::Vibrate(int leftVal, int rightVal)
{
    new std::thread(&XboxController::ViberateThread, vibStruct(leftVal, rightVal, 1000), _controllerNum);
}

提案どおりに ViberateThread を静的にし、コントローラー番号を渡しました。また、方法が示唆するように、vals を const にしました。

void XboxController::ViberateThread(const vibStruct& vals, int controllerNum){ 
    //code...
}

みんなの助けに感謝します。私の新しく統合されたコードがコーディングの慣行を壊したり、私が行った恐ろしいことで誰かを泣かせたりしないことを願っています:) .

4

1 に答える 1

0

私は試したことはありませんstd::threadが、スレッド参照から-

4) コピー コンストラクターが削除されます。スレッドはコピーできません。2 つの std::thread オブジェクトが同じ実行スレッドを表すことはできません。

コードはコピー コンストラクターを呼び出します。

std::thread vibThread = std::thread(XboxControler::VibreateThread,
                                    vibStruct(leftVal, rightVal, 1000));

また、右辺値を非 const 参照にバインドしようとしています。だから試してみてください-

std::thread vibThread(&XboxControler::VibreateThread,
                      vibStruct(leftVal, rightVal, 1000));

                     // Note the addition of & operator as compiler suggested

そして変更 -

void XboxControler::VibreateThread(const vibStruct& vals);
                                 //^^^^ notice the const key word
于 2014-03-21T17:21:46.603 に答える