Pregunta

Estoy trabajando en una aplicación que carga el contenido del archivo en el servidor.

Para cargar el archivo al servidor que estoy utilizando la clase ‘QNetworkAccessManager’. Ya que funciona como una forma asíncrona, lo cambié por el trabajo como forma sincrónica utilizando QEventLoop.

Class FileTransfer
{
Public : 
     QNetworkAccessManager mNetworkManager;
     Void Upload(QNetworkRequest request, QIODevice *data)
     {
           responce = mNetworkManager.put(request, data);
           EventLoop.exec();
           ReadResponce(responce);
      }

      Void Stop()
      {
            responce ->close();
      }
}

En mi aplicación de ejemplo tengo 2 ventanas. Primero para seleccionar los archivos y el segundo para mostrar el progreso.

Cuando el usuario haga clic en el botón de carga en la primera ventana, se mostrará la segunda ventana y luego crear el FileTransfer objeto y iniciar la carga.

Si bien la posibilidad de subir el archivo si el usuario cierra el formulario a continuación, en el destructor de la ventana que llame a la parada de ' FileTransfer ' después de que elimino el objeto ' FileTransfer ' .

Pero aquí el Subir () función todavía no está completado por lo que se colgará.

Por favor, ayúdame a: ¿Cómo esperar en 'stop () ' función hasta que se complete la función de carga ()

¿Fue útil?

Solución

Por lo que puedo ver desde su código, que está ejecutando un QEventLoop pero usted no está realmente conectar su ranura "dejar de fumar" a cualquier señal. Tome el siguiente ejemplo, inicio de sesión es un QHttp - y el código se toma de algo diferente -. Sino que se aplica el principio

/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();

Esto se podría aplicar a su código, si no me equivoco, como este ...

/* connect the signal to the relevant slot */
connect(&mNetworkManager, SIGNAL(finished( QNetworkReply )), &EventLoop, SLOT(quit()));
/* Execute the code that will run during QEventLoop */
responce = mNetworkManager.put(request, data);
/* Execute the QEventLoop */
EventLoop.exec();

Disculpas si he confundido la consulta! Sólo estoy llegar a enfrentarse con el cuarto de galón de nuevo después de un descanso, pero creo que esto es lo que quiere decir! Buena suerte!

Otros consejos

Creo que es necesario agregar algo así en su función de carga:

if (upf->openFile())
{
    reply = manager->post(request, upf);
    connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SIGNAL(progress(qint64,qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
    isInProgress = true;
    emit started();
} else
{
    emit finished(true, false, tr("Error: can't open file %1").arg(filename));
}

Este es el código texto completo: datacod-qt-herramientas

Hope que ayuda.

En lo personal, yo recomendaría no usar cualquiera de estas respuestas. Sería suficiente con conectar una cuenta atrás pestillo a la señal.

Así se podría escribir:

Latch latch( 1 );
QObject::connect( reply, SIGNAL(finished()),
                  &latch, SLOT(countDown()) );

latch.wait();

Para esto se necesita un envoltorio:

class Latch : public QObject {
    Q_OBJECT
public:
    Latch( uint count );
    void wait();
public slots:
    void countDown();
private:
    gcl::countdown_latch _latch;
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top