2011-03-30 21 views
11

estoy usando Qt 4.6.3 y el siguiente código no-trabajoesperar QNetworkReply por terminado

QStringList userInfo; 
QNetworkRequest netRequest(QUrl("http://api.stackoverflow.com/1.1/users/587532")); 
QNetworkReply *netReply = netman->get(netRequest); 

// from here onwards not working 
netReply->waitForReadyRead(-1); 
if (netReply->isFinished()==true) 
{userInfo << do sth to reply;} 
return userInfo; 

ya que esta función devuelve un QStringList vacío, la aplicación se bloquea. ¿Cómo que esperar hasta que la solicitud ha terminado y luego procesar la respuesta dentro de una función

Respuesta

33

Puede utilizar bucle de eventos: (? 20)

QEventLoop loop; 
connect(netReply, SIGNAL(finished()), &loop, SLOT(quit())); 
loop.exec(); 
// here you have done. 

También se debe considerar la adición de un poco de tiempo de espera más corto que la red. No estoy seguro si se llama al final incluso si se produjo un error. Entonces, es posible, que también se haya conectado a la señal de error.

+0

También la otra respuesta también incluye mención de QEventLoop, esta respuesta fue correcta en una vez. –

+1

no he encontrado ninguna situación en la que se haya llamado al slot terminado. Sé que el documento dice que generalmente se llama pero para mí siempre se llama – chikuba

+0

. Solo significa que debe considerar conectarse a algunas señales adicionales. No importa si "siempre me llaman". Puede haber una situación (como dicen los documentos) cuando no obtendrá la señal de finalizado(), por lo que su ciclo de evento se bloqueará –

5

En primer lugar os recomiendo leer la documentación pertinente de la documentación Reference Qt que se puede encontrar aquí: http://doc.qt.nokia.com/latest/classes.html.

En cuanto a su código de muestra, parece que ya tiene, junto con QNetworkRequest y QNetworkReply, un QNetworkAccessManager. Lo que necesita es conectar una ranura a la señal finished(QNetworkReply *). Esta señal se emite cada vez que finaliza una respuesta de red pendiente.

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
connect(manager, SIGNAL(finished(QNetworkReply*)), 
     this, SLOT(replyFinished(QNetworkReply*))); 

manager->get(QNetworkRequest(QUrl("http://api.stackoverflow.com"))); 

Ahora, en su ranura, puede leer los datos que se enviaron en respuesta a su solicitud. Algo así como:

void MyClass::MySlot(QNetworkReply *data) { 
    QFile file("dataFromRequest"); 
    if (!file.open(QIODevice::WriteOnly)) 
     return; 
    file.write(data->readAll()); 
    file.close(); 
} 

EDIT:

que esperar de forma sincronizada para un uso QEventLoop señal. Usted tiene aquí un ejemplo

http://wiki.forum.nokia.com/index.php/How_to_wait_synchronously_for_a_Signal_in_Qt

+0

También sé esto, pero ¿cómo podría devolver los datos recibidos dentro de la misma función (no puedo querer tener una función de ranura adicional) – yolo

Cuestiones relacionadas