У меня возникли проблемы с созданием потока в 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...
}
Спасибо всем за помощь, я надеюсь, что мой новый объединенный код не нарушает практики кодирования и не заставляет людей плакать о какой-то ужасной вещи, которую я сделал 🙂
Постскриптум Я также заметил орфографические ошибки, которые теперь исправлены, так что каждый может отдохнуть спокойно.
Я никогда не пробовал использовать 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
Других решений пока нет …