2013-05-18 3 views
2

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

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

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

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

ответ

4

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

+0

Чтобы добавить, бывают ситуации, когда запрос может быть действительно завершен немедленно (подумайте f.i. при доступе к схемам URL-адреса 'file' или' qrc', нет задействованной сети). В любом случае QNR не будет запускать 'finished()' перед возвратом в цикл событий. Стандартный способ реализовать это в Qt - как общий шаблон, полезный для ваших классов, - это вызов QMetaObject :: invokeMethod (это, «signalName», Qt :: QueuedConnection). – peppe

+0

У меня лично есть случай, когда поток, выполняющий вторую и третью строки кода в исходном сообщении, не является основным потоком (основной поток - это поток, который обрабатывает события). Поскольку они являются отдельными потоками, позволяет ли это обрабатывать события перед вызовом connect()? QNetworkAccessManager был создан в основном потоке, но get() встречается в отдельном потоке. –

Смежные вопросы