Russian Qt Forum
Июнь 16, 2024, 01:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Окно загрузки данных  (Прочитано 16074 раз)
vovan1982
Гость
« : Июнь 18, 2012, 14:22 »

Здравствуйте.

Интересует следующий вопрос:

Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.

Подскажите пожалуйста как сделать чтоб на момент подвисания программы появлялось окно с надписью, к примеру "Ждите идёт загрузка...", а после отвисания исчезало.

Ни как не могу понять с какой стороны подступится к данной проблеме.

Спасибо.
Записан
Serr500
Гость
« Ответ #1 : Июнь 18, 2012, 14:36 »

Вытягивать данные в отдельном потоке. По окончании процесса генерировать сигнал. В GUI сделать таймер. Если после запуска запроса прошла секунда (100мс, 3 секунды, и т.п. - выбрать по вкусу. Можно и сразу, но при коротких запросах это будет некрасиво.), вывести окошко "Ждите...". Получив сигнал, похерить окошко.
Записан
vovan1982
Гость
« Ответ #2 : Июнь 18, 2012, 15:38 »

А без второго потока ни как?
а то я с потоками не работал ни когда.
Записан
Serr500
Гость
« Ответ #3 : Июнь 18, 2012, 15:47 »

Насколько мне известно, никак.
Записан
trot
Гость
« Ответ #4 : Июнь 18, 2012, 15:50 »

Цитировать
А без второго потока ни как?
Никак.
Еще надо учитывать, такую особенность, что пользователь может своими действиями не дождавшись одного результата запроса, запустить следующий запрос и такми образом выстроить очередь запросов, ну так далее. Т.е. необходимо продумать политику реакции итерфейса на действия пользователя.
Записан
alexis031182
Гость
« Ответ #5 : Июнь 18, 2012, 15:58 »

...
Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.
...
Может быть стоит подумать над оптимизацией кода взаимодействия программы с БД? Часто совершенно не имеет смысла переливать всю информацию из таблиц в память. Или в Вашем случае нужно именно так?
Записан
vovan1982
Гость
« Ответ #6 : Июнь 18, 2012, 16:44 »

...
Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.
...
Может быть стоит подумать над оптимизацией кода взаимодействия программы с БД? Часто совершенно не имеет смысла переливать всю информацию из таблиц в память. Или в Вашем случае нужно именно так?

Полученные данные затягиваются в модель в которой из них строится дерево, пробовал реализовать fechMore() но в результате помимо подвисания при получении данных в начале, получил ещё подвисания при разворачивании каждой ветки дерева.
Вот и решил что самым оптимальным будет окошко с уведомлением, иначе кажется что прога тупо зависла.
« Последнее редактирование: Июнь 18, 2012, 16:46 от vovan1982 » Записан
vovan1982
Гость
« Ответ #7 : Июнь 18, 2012, 16:46 »

Спасибо всем за ответы, буду учить потоки Улыбающийся
Записан
alexis031182
Гость
« Ответ #8 : Июнь 18, 2012, 17:21 »

Мне кажется, что вьюха всё же должна более плотно работать с моделью. Как-то в пустую тратятся ресурсы. Действительно, ну зачем гнать из модели во вьюху 1000 строк, если максимум штук 100 будет выведено. Если пользователь двинет ползунок прокрутки, значит только тогда и подгружать следующую порцию данных. А может так статься, что ползунок сместится на незначительное расстояние, что будет требовать ещё меньшего количества подгружаемых данных. В итоге - минимум тормозов, если таковые вообще возникнут.

А если ещё взглянуть в сторону веба, то там подобные проблемы решаются при помощи пагинации, часто вкупе с аяксом. Другими словами, выглядит более рационально. В чём я не прав?
Записан
vovan1982
Гость
« Ответ #9 : Июнь 18, 2012, 17:31 »

Мне кажется, что вьюха всё же должна более плотно работать с моделью. Как-то в пустую тратятся ресурсы. Действительно, ну зачем гнать из модели во вьюху 1000 строк, если максимум штук 100 будет выведено. Если пользователь двинет ползунок прокрутки, значит только тогда и подгружать следующую порцию данных. А может так статься, что ползунок сместится на незначительное расстояние, что будет требовать ещё меньшего количества подгружаемых данных. В итоге - минимум тормозов, если таковые вообще возникнут.

На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Записан
mutineer
Гость
« Ответ #10 : Июнь 18, 2012, 17:36 »

У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?

Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран. Вот и не грузи все остальные сразу, а только когда вьюха их запросит. Или, что еще лучше, загружай немножко больше, чем нужно вьюхе, и подгружай по мере приближения запросов к границе загруженных данных
Записан
alexis031182
Гость
« Ответ #11 : Июнь 18, 2012, 17:54 »

На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
Если данных очень много, то вполне ожидаемо, что будут тормоза. Под это дело выделяется память. И помимо собственно самих табличных данных, выделяется память и под всякого рода "служебную" инфу. Всё это безусловно нужно, но нужно ли всё сразу, вот в чём вопрос.

У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Боюсь, что решения у меня для Вас нет. Здесь нужен гуру кьютишного Model/View (я больше в другой области). Просто когда-то давно, ещё на первых версиях четвёрки (Qt4) я делал фронтэнд к менеджеру пакетов для Linux. Тоже был вьювер, тоже была модель, тоже куча позиций, измеряемых десятками тысяч. Единственное, в роли БД выступало API пакетного менеджера, но суть задачи сводилась к тому же, что и у Вас. Стоило мне всех их загружать разом, так сразу возникали жуткие GUI-тормоза. Поэтому я сделал решение, логику которого описал в посте выше, т.е. частичную подгрузку. И всё стало шикарно работать. Во время подгрузки новых позиций, если пользователь шнырял ползунком прокрутки туда-сюда, нужные итемы всегда довольно быстро подгружались.

Как я это сделал - не помню, да и к сожалению код у меня не сохранился. Вроде там была реализована плотная связка между моделью и вьювером, то есть каждый знал о состоянии каждого. Конечно, это вроде как нарушение принципа Qt MV, но такое частное решение позволило обойтись без потоков и работало весьма сносно.
Записан
alexis031182
Гость
« Ответ #12 : Июнь 18, 2012, 17:55 »

Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема
Записан
mutineer
Гость
« Ответ #13 : Июнь 18, 2012, 18:04 »

Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема

Конечно непонятно - кода ведь нет
« Последнее редактирование: Июнь 18, 2012, 18:06 от mutineer » Записан
vovan1982
Гость
« Ответ #14 : Июнь 18, 2012, 20:02 »

Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема

Конечно непонятно - кода ведь нет

Исходник модели

.h - http://gitorious.org/workerplace/workerplace/blobs/master/headers/devicemodel.h
.cpp - http://gitorious.org/workerplace/workerplace/blobs/master/source/devicemodel.cpp

Исходник класса дерева

.h - http://gitorious.org/workerplace/workerplace/blobs/master/headers/treeitem.h
.cpp - http://gitorious.org/workerplace/workerplace/blobs/master/source/treeitem.cpp

Исходник класса управления модели

.h - http://gitorious.org/workerplace/workerplace/blobs/master/headers/devicemodelcontrol.h
.cpp - http://gitorious.org/workerplace/workerplace/blobs/master/source/devicemodelcontrol.cpp

Ну и виджет который использует модель

.h - http://gitorious.org/workerplace/workerplace/blobs/master/headers/device.h
.cpp - http://gitorious.org/workerplace/workerplace/blobs/master/source/device.cpp


На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
Если данных очень много, то вполне ожидаемо, что будут тормоза. Под это дело выделяется память. И помимо собственно самих табличных данных, выделяется память и под всякого рода "служебную" инфу. Всё это безусловно нужно, но нужно ли всё сразу, вот в чём вопрос.

У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Боюсь, что решения у меня для Вас нет. Здесь нужен гуру кьютишного Model/View (я больше в другой области). Просто когда-то давно, ещё на первых версиях четвёрки (Qt4) я делал фронтэнд к менеджеру пакетов для Linux. Тоже был вьювер, тоже была модель, тоже куча позиций, измеряемых десятками тысяч. Единственное, в роли БД выступало API пакетного менеджера, но суть задачи сводилась к тому же, что и у Вас. Стоило мне всех их загружать разом, так сразу возникали жуткие GUI-тормоза. Поэтому я сделал решение, логику которого описал в посте выше, т.е. частичную подгрузку. И всё стало шикарно работать. Во время подгрузки новых позиций, если пользователь шнырял ползунком прокрутки туда-сюда, нужные итемы всегда довольно быстро подгружались.

Как я это сделал - не помню, да и к сожалению код у меня не сохранился. Вроде там была реализована плотная связка между моделью и вьювером, то есть каждый знал о состоянии каждого. Конечно, это вроде как нарушение принципа Qt MV, но такое частное решение позволило обойтись без потоков и работало весьма сносно.

Жаль что у вас не осталось исходников было бы интересно взлянуть на реализацию, думаю не только мне Улыбающийся.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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