#c #qt #qthread
#c #qt #qthread
Вопрос:
Итак, у меня есть эта функция-член в классе AntiFlood:
void AntiFlood::unBan()
{
QThread::msleep(5000);
std::string lineToPost = "KICK " roomToPost " " nickToPost "rn";
sendIT(lineToPost);
}
и я хочу передать его:
threadpool.globalInstance()->start(отменить запрет);
-
который не работает — выдает ошибку: нет соответствующей функции для вызова ‘QThreadPool::start()’ threadpool.globalInstance()->start(unBan); ^; но, с другой стороны, если я использую лямбда:
auto lam = [this, room, nick](){ QThread::msleep(5000); std::string lineToPost = "KICK " roomToPost " " nickToPost "rn"; sendIT(lineToPost); }; threadpool.globalInstance()->start(lam);
это работает нормально.
Как мне передать void AntiFlood::unBan() в threadpool.globalInstance()->start(), который требует std::function<void()> functionToRun ?
Ответ №1:
Основная проблема, которую вы видите, заключается в том, что AntiFlood::unBan
является (или, по крайней мере, «кажется») нестатической функцией-членом. В этом случае он должен быть вызван для допустимого объекта типа AntiFlood
. Поскольку QThreadPool::start
имеет подпись…
void QThreadPool::start(std::function<void ()> functionToRun, int priority = 0)
вам нужно передать ему «автономный» std::function<void()>
, с чем вы и закончили…
auto lam = [this, room, nick]()
{
QThread::msleep(5000);
std::string lineToPost = "KICK " roomToPost " " nickToPost "rn";
sendIT(lineToPost);
};
threadpool.globalInstance()->start(lam);
путем захвата this
в лямбда.
Короче говоря, я бы сказал, что способ, которым вы сейчас занимаетесь, является правильным / принятым способом.