crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> [Qt 4.5.0] QHttp и QProgressDialog, странное поведение
SABROG
  опции профиля:
сообщение 17.6.2009, 11:17
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Хочу отображать QProgressDialog сразу же как пользователь нажал на кнопку типа "Скачать". Если не делать dialog.exec(), то обычно диалог появляется через 4 секунды сам (minimumDuration) или при первом step'e (изменении значения в прогрессе). Вроде бы все работает нормально за исключением того, что пользователь ждет появления диалога секунд 10, а сам диалог появляется на секунды 3. Связано это с тем, что при запросе xml файла с http сервера присходит его генерирование на основе данных в БД, а сам процесс скачивания быстрый. Так вот если все-таки делать dialog.exec(), чтобы пользователь хотябы видел, что нажатие на кнопку запустило процесс ожидания файла с сервера, то получается следующая ситуация.

По сигналу void QHttp::dataReadProgress ( int done, int total ) [signal] я меняю прогресс на диалоге. Иногда всё нормально работает и при достижении done==total диалог автоматически закрывается (типа 100% скачано). А иногда done приходит меньше, чем total, но затем следует requestFinished не дойдя до 100% и диалог остается висеть на 98-99% пока не нажмешь cancel. Ввиду разного поведения в разных ситуациях я исключаю возможность того, что сервер передает неправильный размер данных.

Сообщение отредактировал SABROG - 17.6.2009, 12:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 20.6.2009, 1:56
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(BRE @ 20.6.2009, 1:10) *
Но если поменять местами коннекты,
очень интересное наблюдение.
Они, что асинхронно подключаются? Хм.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 20.6.2009, 5:53
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Litkevich Yuriy @ 20.6.2009, 2:56) *
Цитата(BRE @ 20.6.2009, 1:10) *
Но если поменять местами коннекты,
очень интересное наблюдение.
Они, что асинхронно подключаются? Хм.

Сейчас нет времени проверить, но вроде при конекте, все получатели сигнала заносятся в список и при emit'е вызываются согласно этого списка. Думаю в этом причина.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.6.2009, 8:30
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


В документации о сигналах и слотах написано:

Цитата
If several slots are connected to one signal, the slots will be executed one after the other, in an arbitrary order, when the signal is emitted.


Но тут я понимаю, один и тот же сигнал и несколько слотов. А вот почему меняется порядок вызовов слотов для двух совершенно разных сигналов - непонятно. Не исключаю, что порядок connect'ов может влиять на ситуацию, но это такое же откладывание существующей проблемы как и show вместо exec. В варианте с QHttp сначала приходил сигнал finished(), а потом сигнал dataReadProgress. Но т.к. сам сигнал информационный и безобидный, то с этим еще как-то можно жить, а вот когда приходит сигнал readyRead и слот пытается записать данные в файл, который уже закрыт и указатель стал уже не валидным, вот тут программа и падает. И виной всему этому, казалось бы безобидный, QProgressBar, который я решил добавить для удобство пользователя. Маленькие причины - большие последствия.

Проверил на Qt 4.6, там ситуация еще хуже. Помимо того, что есть баг с неправильным порядком вызовов слотов, так там с каждым новым скачиванием приходит на 1 больше сигналов finished(). Т.е. если я скачаю файл 10 раз, то в конце скачки десятого раза придет 10 сигналов finished() + последним может прийти сигнал readyRead после них. Тролли молчат второй день, наверно выходные.
---

Моя ошибка, тут каждый раз один и тот же сигнал добавляется к предыдущему:

    void buttonClicked(bool checked = false)
    {
       connect(&netmanager, SIGNAL(finished(QNetworkReply *)),
                this, SLOT(finished(QNetworkReply *)));


Переделал на

connect(reply, SIGNAL(finished()), this, SLOT(finished()))


Но проблема с тем, что слот finished вызывается предпоследним осталась.

Сообщение отредактировал SABROG - 22.6.2009, 17:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- SABROG   [Qt 4.5.0] QHttp и QProgressDialog   17.6.2009, 11:17
- - kwisp   SABROG, действительно странное поведение. так как...   17.6.2009, 11:26
- - SABROG   Решил вывести в консоль прогресс, вот что получил:...   17.6.2009, 12:03
- - kwisp   Цитата(SABROG @ 17.6.2009, 13:03) Похоже ...   17.6.2009, 13:00
- - SABROG   Прежде чем постить баг троллям попробуйте у себя т...   17.6.2009, 14:03
- - Litkevich Yuriy   QProgressDialog вообще чудной, У меня инициализир...   17.6.2009, 14:16
- - SABROG   Откуда берется понятно: void QProgressDialogPriva...   17.6.2009, 14:24
- - Litkevich Yuriy   Может оно и из-за английской (пиратская) Но у меня...   17.6.2009, 14:43
- - SABROG   Цитата(Litkevich Yuriy @ 17.6.2009, 15:43...   17.6.2009, 15:13
- - Litkevich Yuriy   Цитата(SABROG @ 17.6.2009, 19:13) я не на...   17.6.2009, 15:23
- - SABROG   Вот гифку накатал, которая показывает в чем пробле...   17.6.2009, 15:42
- - Litkevich Yuriy   поменял местами: progressDlg.setValue(done); progr...   17.6.2009, 16:40
- - SABROG   Цитата(Litkevich Yuriy @ 17.6.2009, 17:35...   17.6.2009, 16:47
- - Litkevich Yuriy   Сейчас код так выглядит: public slots: void b...   17.6.2009, 16:51
- - SABROG   Так ты же считерил //progressDlg.exec();...   17.6.2009, 16:56
- - Litkevich Yuriy   //progressDlg.exec(); progressDlg.setWin...   17.6.2009, 17:07
- - SABROG   Цитата(Litkevich Yuriy @ 17.6.2009, 18:07...   17.6.2009, 17:49
- - SABROG   Опаньки народ, получил такое письмо от троллей: Ц...   18.6.2009, 12:05
- - Litkevich Yuriy   где-то я уже слышал про рекомендацию использования...   18.6.2009, 15:33
|- - SABROG   Цитата(Litkevich Yuriy @ 18.6.2009, 16:33...   18.6.2009, 17:35
- - Litkevich Yuriy   с сеткой ещё не разу не работал, поэтому ничего пе...   18.6.2009, 17:55
- - SABROG   Вообще мне интересно влияет ли скорость скачивания...   18.6.2009, 17:59
- - Litkevich Yuriy   Цитата(SABROG @ 18.6.2009, 21:59) от коли...   18.6.2009, 18:04
|- - SABROG   Цитата(Litkevich Yuriy @ 18.6.2009, 19:04...   18.6.2009, 18:42
- - Авварон   бтв у меня программа выдавала double free при юзан...   18.6.2009, 22:12
- - SABROG   Цитата(SABROG @ 18.6.2009, 13:05) Передел...   19.6.2009, 18:00
|- - BRE   Цитата(SABROG @ 19.6.2009, 19:00) Я воспр...   19.6.2009, 21:10
- - Litkevich Yuriy   Цитата(BRE @ 20.6.2009, 1:10) Но если пом...   20.6.2009, 1:56
|- - BRE   Цитата(Litkevich Yuriy @ 20.6.2009, 2:56)...   20.6.2009, 5:53
|- - SABROG   В документации о сигналах и слотах написано: Цита...   20.6.2009, 8:30
- - Kagami   А меня, кстати, пару дней мучает вопрос: "Про...   20.6.2009, 10:32
|- - SABROG   Цитата(Kagami @ 20.6.2009, 11:32) А меня,...   20.6.2009, 10:35
- - Kagami   Попробуй переопределить Цитатаvoid QObject::discon...   20.6.2009, 10:43
- - SABROG   Цитата(Kagami @ 20.6.2009, 11:43) и посмо...   20.6.2009, 11:20
- - SABROG   Я в ступоре, сейчас тролли говорят, что это нормал...   22.6.2009, 18:23
- - SABROG   Баг признали, правда тикет еще не приняли. Пока со...   23.6.2009, 10:57
- - Litkevich Yuriy   а я что-то непонял насчёт этого варианта, разъясни   23.6.2009, 20:37
- - SABROG   Цитата(Litkevich Yuriy @ 23.6.2009, 21:37...   23.6.2009, 20:44
- - Litkevich Yuriy   я пока вижу только то, что добавился признак соеди...   23.6.2009, 20:50
|- - BRE   Цитата(Litkevich Yuriy @ 23.6.2009, 21:50...   24.6.2009, 8:09
- - Litkevich Yuriy   ну тогда вроде понятно, т.к. само событие finished...   24.6.2009, 8:24
|- - BRE   Цитата(Litkevich Yuriy @ 24.6.2009, 9:24)...   24.6.2009, 8:48
- - Litkevich Yuriy   тут у меня тоже мыслей нет.   24.6.2009, 9:02
- - SABROG   Говорят, что пофиксили: ЦитатаGood news, I think ...   25.6.2009, 16:55


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 12:22