Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中创建线程+;带过载错误 我在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_C++_Multithreading_C++11_Xinput - Fatal编程技术网

在C+中创建线程+;带过载错误 我在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

在C+中创建线程+;带过载错误 我在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,c++,multithreading,c++11,xinput,C++,Multithreading,C++11,Xinput,我在网上搜索过,但没有结果,我不太确定是什么原因造成的,我希望有人能指出我哪里出了问题 与此问题相关的代码是 目前,出于测试目的,使用1000毫秒。它为控制器振动创建线程,以便在停止之前可以持续一定的时间 void XboxControler::Vibrate(int leftVal, int rightVal) { std::thread vibThread = std::thread(XboxControler::VibreateThread,vibStruct(leftVal, r

我在网上搜索过,但没有结果,我不太确定是什么原因造成的,我希望有人能指出我哪里出了问题

与此问题相关的代码是

目前,出于测试目的,使用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是由编者指出的,起初我拒绝了,因为它仍然给我错误。我创建了一个新线程,该线程在执行振动方法后不会被破坏

void XboxController::Vibrate(int leftVal, int rightVal)
{
    new std::thread(&XboxController::ViberateThread, vibStruct(leftVal, rightVal, 1000), _controllerNum);
}
我按照建议将ViberateThread设置为静态,并传入控制器编号。我还按照建议将VAL设置为常量

void XboxController::ViberateThread(const vibStruct& vals, int controllerNum){ 
    //code...
}
谢谢大家的帮助,我希望我新合并的代码没有破坏任何编码实践,也没有让任何人因为我做的一些可怕的事情而哭泣:)
另外,我还注意到拼写错误,这些错误现在已经被修复,大家都可以放心了。

我从来没有尝试过使用

std::thread
,但是从-

4) 删除复制构造函数;线程是不可复制的。没有两个 线程对象可以表示相同的执行线程

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

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

编译器非常清楚:
使用“&xboxcontroller::vibrateThread”
,不是吗?有关更多信息和示例,请查看。还要注意的是,不能以这种方式使用非静态类成员函数来初始化线程。@πάνταῥεῖ 我试过了,它说这个术语的计算结果不是一个带1个参数的函数,所以它可能是另一个函数。@Songy:的确如此。由于它是一个成员函数,您还需要一个
XboxController
(例如
this
)来调用它。在这种情况下,
XboxController::vibrateThread
需要是一个静态类成员。@πάνταῥεῖ 你说得对。但是OP似乎在成员函数中使用成员变量(
\u controllerNum
)。我认为OP必须创建一个对象并传递参数,如
(obj.*vibrateThread)