Russian Qt Forum
Ноябрь 23, 2024, 05:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qNetworkManager - потерялась асинхронность.  (Прочитано 5286 раз)
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();
 
}

Заранее большое спасибо всем откликнувшимся!
« Последнее редактирование: Октябрь 30, 2015, 12:22 от Mira » Записан
Mira
Гость
« Ответ #1 : Октябрь 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++);
}
Записан
Tamori Nao
Гость
« Ответ #2 : Октябрь 30, 2015, 12:09 »

Попробуй qApp-> process events()
Записан
Mira
Гость
« Ответ #3 : Октябрь 30, 2015, 12:12 »

Фокус не удался, за вариант - спасибо )

Записан
Bepec
Гость
« Ответ #4 : Октябрь 30, 2015, 12:24 »

Фокус удастся, если вы поставите рекомендованную вам строчку в нужное место. Так же тут влияет ширина канала. Если вам приходит всё за один пакет, то и обновится он один раз.


Записан
Mira
Гость
« Ответ #5 : Октябрь 30, 2015, 12:26 »

За один пакет не приходит, в qDebug я вижу как все сливается потихоньку мне на комп.

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

(в конце слота, как и основной функции не помогло)
Записан
Mira
Гость
« Ответ #6 : Октябрь 30, 2015, 12:36 »

Идея c приходом за один пакет - довела меня до верной мысли, спасибо огромное, Верес!  Веселый

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

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

« Последнее редактирование: Октябрь 30, 2015, 14:02 от Mira » Записан
Tamori Nao
Гость
« Ответ #7 : Октябрь 30, 2015, 13:04 »

Если не сложно, покажите потом код
Записан
Mira
Гость
« Ответ #8 : Октябрь 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);;
}
Записан
Bepec
Гость
« Ответ #9 : Октябрь 30, 2015, 17:15 »

Вы просто рекомендованную строчку куда то не туда пихаете, раз у вас проблемы. Показали б код, куда пихали - мы б вам и подправили Веселый
Записан
Mira
Гость
« Ответ #10 : Октябрь 31, 2015, 09:48 »

Улыбающийся так загадочно написали только строчку, кто ж разберет куда ее присунуть Улыбающийся потыкала везде, бесполезно. Но все равно очень полезно вы меня на мысль вывели, так бы еще два дня протыкалась.

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 20.