ожидание сигнала

Я работаю над приложением, которое загружает содержание файла к серверу.

Для загрузки файла на сервер, я использую класс ‘QNetworkAccessManager’. Так как это работает асинхронным путем, я изменил его для работы синхронным путем при помощи 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();
      }
}

В моем примере приложения у меня есть 2 окна. 1-й для выбора файлов и 2-й для показа прогресса.

Когда пользователь нажмет на кнопку загрузки в первом окне, 2-е окно будет отображено, и затем я создаю FileTransfer, возражают и начинают загружать.

При загрузке файла, если пользователь закрывает форму затем в деструкторе окна, я называю остановку ‘FileTransfer’ после этого, я удаляю объект ‘FileTransfer’.

Но здесь Загрузка () функция еще не завершается так, она откажет.

Помогите мне к: Как ожидать на 'остановке ()' функция до Загрузки (), функция завершается

11
задан starsplusplus 14 January 2014 в 16:57
поделиться

2 ответа

Из того, что я вижу из вашего кода, вы выполняете QEventLoop, но на самом деле вы не соединяете его слот "quit" с каким-либо сигналом. В качестве примера возьмем следующее, login - это QHttp - и код взят из чего-то другого - но принцип применим.

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

Это можно применить к вашему коду, если я не ошибаюсь, вот так...

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

Извините, если я ошибся в вашем вопросе! Я только начинаю осваивать qt после перерыва, но я думаю, что это то, что вы имеете в виду! Удачи!

19
ответ дан 3 December 2019 в 06:20
поделиться

Я думаю, вам нужно добавить что-то подобное в вашу функцию загрузки:

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

Вот полный текстовый код: datacod-qt-tools

Надеюсь, это поможет.

0
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: