Qt: Лучший подход для ожидания сигнала от функции

0

У меня сейчас что-то вроде этого

void foo::replyFinished(QNetworkReply* rply)
{
     .....
     .....
}

void foo::ReceiveReport()
{
  //Communicate with http
   QUrl url(url_complete.c_str());
   QNetworkRequest request;
   request.setUrl(url);
   currentReply = networkManager->get(request);
}


void foo::mymethodA()  //Start from here
{
   ReceiveReport();
   -----------------> Wait();
   MoreStuff();
}

Теперь происходит то, что я называю mymethodA. Этот метод называется ReceiveReport. В отчете приема есть сигнал, который соединяется с replyFinished(). Теперь я хочу подождать, пока я не получаю ответ от сети, и это происходит, когда вызывается responseFinished. В настоящее время проблема заключается в том, что метод MoreStuff() вызывается до запуска метода replyFinished(). Мой вопрос: как я могу заставить его подождать, пока я не получу ответ? Все они работают в одном потоке

  • 2
    Вам не следует ждать в слотах Qt. Просто переместите MoreStuff() чтобы replyFinished реализация. Или сделайте MoreStuff() слотом и подключите его к сигналу QNetworkReply::finished MoreStuff() объекта, возвращаемого администратором сети.
Теги:
qt

1 ответ

0
Лучший ответ

Это не может работать без уродливого взлома processEvent(). Вам нужен слот, который выполняет обработку. Сигналы и слоты в Qt работают только в том случае, если вы оставите метод и даете qt время для запуска цикла событий.

Другим способом было бы использование разных потоков.

У вас нет асинхронного вызова С# и ждут в qt, пусть эта парадигма идет.

Пожалуйста, прочитайте документы о цикле событий Qt еще раз, чтобы лучше понять, а затем заставить себя программировать на основе событий, потому что это то, что qt может предложить и как он работает, как только вы запустите в QApplication exec()

  • 0
    +1 за предложение основанного на событиях программирования вместо того, чтобы предлагать уродливые хаки. (Еще один - локальные циклы событий, но я бы не рекомендовал всем, кто их использует, поэтому я не буду описывать, как они работают ...)
  • 0
    Это возможно без processEvents . Просто используйте QEventLoop .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню