Pergunta

Estou trabalhando em um aplicativo que carrega o conteúdo do arquivo no servidor.

Para fazer upload do arquivo no servidor, estou usando a classe 'QNetworkAccessManager'. Como funciona como uma maneira assíncrona, mudei para funcionar como maneira síncrona usando o 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();
      }
}

No meu aplicativo de amostra, tenho 2 janelas. 1º para selecionar os arquivos e o segundo para mostrar o progresso.

Quando o usuário clicar no botão de upload na primeira janela, a 2ª janela será exibida e depois eu crio o Transferência de arquivo objeto e inicie o upload.

Enquanto envia o arquivo se o usuário fechar o formulário, no destruidor da janela, eu chamo a parada de 'Transferência de arquivo'Depois disso eu excluo o'Transferência de arquivo'Objeto.

Mas aqui o Envio() A função ainda não está concluída, para que trava.

Por favor me ajude a: como esperar 'Pare()'função até que a função upload () seja concluída

Foi útil?

Solução

Pelo que posso ver no seu código, você está executando um Qeventloop, mas você não está realmente conectando seu slot "Quit" a nenhum sinal. Veja o exemplo abaixo, o login é um qhttp - e o código é retirado de algo diferente - mas o princípio se aplica.

/* 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();

Isso pode ser aplicado ao seu código, se não me engano, assim ...

/* 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();

Desculpas se eu confundi sua consulta! Só estou enfrentando QT novamente após um intervalo, mas acredito que é isso que você quer dizer! Boa sorte!

Outras dicas

Eu acho que você precisa adicionar algo assim na sua função de upload:

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));
}

Aqui está o código de texto completo: Datacod-qt-tools

Espero que ajude.

Pessoalmente, eu recomendaria não usar nenhuma dessas respostas. Seria suficiente conectar uma trava de contagem regressiva ao sinal.

Então você pode escrever:

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

latch.wait();

Para isso, você precisaria de um invólucro:

class Latch : public QObject {
    Q_OBJECT
public:
    Latch( uint count );
    void wait();
public slots:
    void countDown();
private:
    gcl::countdown_latch _latch;
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top