在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
我在网上搜索过,但没有结果,我不太确定是什么原因造成的,我希望有人能指出我哪里出了问题 与此问题相关的代码是 目前,出于测试目的,使用1000毫秒。它为控制器振动创建线程,以便在停止之前可以持续一定的时间在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
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)
。