使用重载错误在C ++中创建线程

时间:2014-03-21 17:07:39

标签: c++ multithreading c++11 xinput

我在使用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静态并传入控制器编号。我也按照建议的方式使val成为const。

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

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

1 个答案:

答案 0 :(得分:0)

我从未尝试使用std::thread,而是使用thread reference -

  

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

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

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

此外,您正在尝试将rvalue绑定到非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