проблема с передачей аргумента в QThreadPool::globalInstance()->start()

#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 в лямбда.

Короче говоря, я бы сказал, что способ, которым вы сейчас занимаетесь, является правильным / принятым способом.