Russian Qt Forum

Qt => Работа с сетью => Тема начата: Mira от Октября 30, 2015, 12:02



Название: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 12:02
Проблема следующая. Делаю запрос - и пока файл скачивается, прогресс бар в UI должен обновляться.
 Чего соответственно не происходит. Мозг мой под вечер совсем не варит, не понимаю почему нет асинхронности с гуем.
(ниже мой пример только с заглушкой и явным указанием потоков - работает правильно)

Код
C++ (Qt)
void UpdaterInstall::HttpPostRequest() {
 
       m_pReply = m_pNetworkManager->get(QNetworkRequest(pDataModel->getHttpLink()));
connect(m_pReply, SIGNAL(readyRead()), this, SLOT(slotDownloadUpdates()));
 
QString strFileName=pDataModel->getFileName();
m_pFile = new QFile(strFileName);
m_pFile->open(QIODevice::WriteOnly);
}
 
void UpdaterInstall::slotDownloadUpdates() {
m_downloadedSize+= m_pFile->write(m_pReply->readAll());
QObject * m_pProgressBar = m_pQml->findChild<QObject*>("updaterProgressBar");
m_pProgressBar->setProperty("value", m_downloadedSize);
qDebug()<<m_pProgressBar->property("value").toInt()<<"  "<<m_pProgressBar->property("maximumValue").toInt();
 
}

Заранее большое спасибо всем откликнувшимся!


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 12:06
В примере-заглушке с явным указанием асинхронности - UI обновляется нормально

Код
C++ (Qt)
void UpdatingProgressState::onEntry(QEvent *) {
 
Worker * pWorker = new Worker;
QThread * pThread = new QThread();
pWorker->moveToThread(pThread);
connect(pThread, SIGNAL(started()), pWorker, SLOT(slotDummyUpdatingRequest()));
connect(pWorker,SIGNAL(sigDummyNextRequestStage()), this, SLOT(slotStageProgressPrint()));
pThread->start();
}
 
void UpdatingProgressState::slotStageProgressPrint() {
QObject * pList = m_pQmlObject->findChild<QObject*>("progressBar");
pList->setProperty("value", m_nProgress++);
}


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Tamori Nao от Октября 30, 2015, 12:09
Попробуй qApp-> process events()


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 12:12
Фокус не удался, за вариант - спасибо )



Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Bepec от Октября 30, 2015, 12:24
Фокус удастся, если вы поставите рекомендованную вам строчку в нужное место. Так же тут влияет ширина канала. Если вам приходит всё за один пакет, то и обновится он один раз.




Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 12:26
За один пакет не приходит, в qDebug я вижу как все сливается потихоньку мне на комп.

А в какое нужное место поставить строчку?

(в конце слота, как и основной функции не помогло)


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 12:36
Идея c приходом за один пакет - довела меня до верной мысли, спасибо огромное, Верес!  :D

Нашлась асинхронность, пакеты прилетают практически мгновенно, вывод в дебаг опаздывает.

Вывод в гуй но в текстовый графич. элемент сработал правильно, проблема именно в прогресс баре, а это уже совсем другая история  ::).



Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Tamori Nao от Октября 30, 2015, 13:04
Если не сложно, покажите потом код


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 30, 2015, 13:42
Не сложно конечно %)
вот что получилось в итоге:

Код
C++ (Qt)
void UpdaterInstall::HttpPostRequest() {
 
//GUI updating
m_pProgressBar = m_pQml->findChild<QObject*>("updaterProgressBar");
UpdaterUpdateData * pDataModel = m_pDataModel->getModelItem<UpdaterUpdateData>();
m_pProgressBar->setProperty("maximumValue", 1200);
m_downloadedSize=0;
//Starting download
m_pReply = m_pNetworkManager->get(QNetworkRequest(pDataModel->getHttpLink()));
connect(m_pReply, SIGNAL(readyRead()), this, SLOT(slotDownloadUpdates()));
QString strFileName="C:/Users/Mira/"+pDataModel->getFileName();
m_pFile = new QFile(strFileName);
if (QFile::exists(strFileName)) {
QFile::remove(strFileName);
}
m_pFile->open(QIODevice::WriteOnly);
}
 
void UpdaterInstall::slotDownloadUpdates() {
int nTemp=m_pFile->write(m_pReply->readAll());
m_downloadedSize+=nTemp/10000;
m_pProgressBar->setProperty("value", m_downloadedSize);;
}


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Bepec от Октября 30, 2015, 17:15
Вы просто рекомендованную строчку куда то не туда пихаете, раз у вас проблемы. Показали б код, куда пихали - мы б вам и подправили :D


Название: Re: qNetworkManager - потерялась асинхронность.
Отправлено: Mira от Октября 31, 2015, 09:48
:) так загадочно написали только строчку, кто ж разберет куда ее присунуть :) потыкала везде, бесполезно. Но все равно очень полезно вы меня на мысль вывели, так бы еще два дня протыкалась.

проблема неработающего прогресс бара как раз не была очевидна из-за хорошо работающей асинхронности.
Размер файла в байтах не влезал в инт переменную прогресс бара, и он вообще нафиг выпадал из жизни и выдавал ошибку. Но так как процесс скачивания файла при этом благополучно асинхронно продолжался, то не было очевидно что главный поток не работает не по причине ожидания докачки.