Подключение слота сигнала Qt - QNetworkAccessManager

Я новичок в Qt и пытаюсь понять следующее соединение сигнального слота:

m_networkManager = new QNetworkAccessManager(this);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, SIGNAL(finished()),this, SLOT(onRequestCompleted()));

Почему мы подключаем "готовый" сигнал после get-запроса?... Что произойдет, если сетевое соединение в строке-2 будет выполняться быстрее до того, как будет выполнено слотовое соединение (строка-3)?

Я знаю, что этот код будет работать. но я хочу понять, как это возможно :)


person Daggit    schedule 18.05.2013    source источник


Ответы (1)


Сигнал Finish() не может быть испущен, потому что вы еще не уступили циклу обработки событий. Даже если каким-то образом запрос на получение был отправлен, а затем возвращен, ваш код все еще выполняется и будет продолжать выполняться до тех пор, пока вы не уступите циклу обработки событий. Только тогда объект ответа получит возможность что-либо сделать, например, проанализировать полученный ответ и выдать соответствующий сигнал.

person Chris    schedule 18.05.2013
comment
Чтобы добавить, есть ситуации, в которых запрос может фактически завершиться немедленно (например, при доступе к схемам URL-адресов file или qrc сеть не задействована). В любом случае QNR не будет запускать finished() до возврата в цикл обработки событий. Стандартный способ реализовать это в Qt — как общий шаблон, полезный для ваших классов — это вызов QMetaObject::invokeMethod(this, "signalName", Qt::QueuedConnection). - person peppe; 19.05.2013
comment
У меня лично есть случай, когда поток, выполняющий вторую и третью строки кода в исходном посте, не является основным потоком (основной поток — это поток, обрабатывающий события). Поскольку это отдельные потоки, позволяет ли это обрабатывать события до вызова connect()? QNetworkAccessManager был создан в основном потоке, но get() выполняется в отдельном потоке. - person Patrick Avery; 30.11.2017