1

我在用 C++ 创建线程时遇到了一些麻烦。当我尝试创建一个时,我得到了这两个错误......

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:

感谢大家的帮助,我通读了所有所说的内容以创建以下有效...

我添加了编译器指出的 & ,我最初驳回了它,因为它仍然给了我错误。我创建了一个新线程,一旦 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...
}

感谢大家的帮助,我希望我新合并的代码不会破坏任何编码实践或让任何人为我所做的一些可怕的事情而哭泣 :) PS 我还注意到现在已经修复的拼写错误,所以每个人都可以高枕无忧.

4

1 回答 1

0

我从未尝试过使用std::thread但来自线程参考-

4)复制构造函数被删除;线程不可复制。没有两个 std::thread 对象可以代表同一个执行线程。

您的代码调用复制构造函数。

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

此外,您正在尝试将右值绑定到非常量引用。所以试试——

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 回答