@Dutymy

Как создать новый поток c++?

Здравствуйте, скажите пожалуйста могу ли я открыть поток используя лямбда виражение к примеру так
#include "MouseManager.h"
MouseManager mouseManager;
		if (recoil.x != 0 && recoil.y != 0) {
			CreateThread(nullptr, 0, [this]() {
				mouseManager.mouseMove(recoil.x, recoil.y, 100);
				return 0;
				}
			, nullptr, 0, nullptr);
		}
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
В общем случае - нет.

CreateThread принимает указатель на функцию. Ей нужен адресс кода, который вы хотите выполнить. И этот самый код должен следовать определенным конвенциям вызова (stdcall). Лямбду к этому не всегда можно привести. Компилятору надо куда-то деть захваченные переменные и как-то их передать в код лямбды. Сами лямбды не обязательно используют те же конвенции вызова, что нужно CreateThread.

Иногда, если ваша лямбда stateless (не захватывает никаких переменных), то некоторые компиляторы (vs, например) смогут эту лямбду перобразовать к указателю на функцию. Но это не ваш случай, потому что у вас захватываются переменные - вам же надо как-то recoil и mouseManager использовать изнутри лямбды.

Если очень хочется лямбду, то чисто теоретически, ваши переменные можно засунуть в глобальные переменные. И тогда лямбда не будет ничего захватывать. Но это дичайший говнокод - так делать не надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы