Назначение кода: Мне нужно иметь возможность комбинировать любой тип функции в качестве параметра конструктора, чтобы я мог вызвать его изнутри этого класса.Конструктор, который будет принимать любые функции в качестве параметра
Почему это должно быть так? Потому что я использую Unreal Engine 4FRunnable Threading, который выполняется таким образом, что поток будет вызывать конкретные интерфейсы (функции виртуальных членов) для запуска потока, поэтому, если я не хочу создавать новый класс для каждого потока задача, которую я хотел бы назначить, мне нужно попробовать и передать ее общие функции, чтобы я мог обладать максимальной функциональностью из моего класса Threading.
Для чего я использую класс нитей?SQLite3 запросов, для каждого запроса, требующего сохранения данных, всегда требуются разные параметры, где в качестве моих SELECT запросов.
Это мой код ниже, первая часть работает нормально, но второй конструктор не работает;
класс резьбы конструктор
FThreading::FThreading(std::function<void()> funcTask) {
//Check if the Thread has not been defined and that the system supports multi threading
if (!Thread && FPlatformProcess::SupportsMultithreading()) {
//Create our thread
voidNoParaFunc = funcTask;
curFlag = 1;
Thread = FRunnableThread::Create(this, TEXT("FThreading"), 0, TPri_BelowNormal);
} else {
//Can't multithread, call the function straight
funcTask();
}
}
Вызов:
std::function<void()> passFunc = std::bind(&UCP_GameInstance::InitDB, GameInst);
FThreading* threadPointer = new FThreading(passFunc);
Теперь это код, который не будет работать, что мне нужна помощь с:
FThreading::FThreading(std::function<bool(FString, FString)> funcTask) {
//Check if the Thread has not been defined and that the system supports multi threading
if (!Thread && FPlatformProcess::SupportsMultithreading()) {
//Create our thread
boolTwoString = funcTask();
curFlag = 2;
Thread = FRunnableThread::Create(this, TEXT("FThreading"), 0, TPri_BelowNormal);
}
else {
//Can't multithread, call the function straight
funcTask();
}
}
Вызов:
void UCP_GameInstance::AddNewSurvivor(FString First, FString Second, FString Nation, FString Age, FString Blood, FString Level, FString Spec) {
FString Query = "INSERT INTO SurvivorData (First, Second, Nation, Age, Blood, Level, Spec) " +
"VALUES (" + First + ", " + Second + ", " + Nation + ", " + Age + ", " + Blood + ", " + Level + ", " + Spec + ");";
std::function<bool(FString, FString)> passFunc = std::bind(&USQLiteDatabase::ExecSql, GetDBName(), Query);
FThreading* threadPointer = new FThreading(passFunc);
}
Любая помощь будет высоко оценена как я застрял в этом вопросе на некоторое время, и теперь, даже дизайн предложения/изменения будут более приглашены.
Спасибо за ваше время.
Спасибо, что нашли время, чтобы ответить. Знаете ли вы, как я мог обойти эту проблему? Некоторое время это был колючий сон. –
@NullByte: Как я уже сказал, мы понятия не имеем, как ваш поток должен придумать эти два строковых аргумента. Просто чтобы проверить, не делаете ли вы глупых предположений: 'ExecSql' принимает 4 строковых аргумента, не так ли? Поскольку вы связали два аргумента и, по-видимому, оставили два несвязанных аргумента строки. – MSalters
С вашим советом мне удалось заставить его работать, спасибо за ваше время, помогая мне, я действительно ценю это –