многопоточность — создание потока в 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 миллисекунд. Это создает нить для вибрации контроллера, поэтому она может длиться определенное время до остановки.

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...
}

Спасибо всем за помощь, я надеюсь, что мой новый объединенный код не нарушает практики кодирования и не заставляет людей плакать о какой-то ужасной вещи, которую я сделал 🙂
Постскриптум Я также заметил орфографические ошибки, которые теперь исправлены, так что каждый может отдохнуть спокойно.

1

Решение

Я никогда не пробовал использовать 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]