Russian Qt Forum
Июнь 16, 2024, 01:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Окно загрузки данных
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Окно загрузки данных (Прочитано 16074 раз)
vovan1982
Гость
Окно загрузки данных
«
:
Июнь 18, 2012, 14:22 »
Здравствуйте.
Интересует следующий вопрос:
Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.
Подскажите пожалуйста как сделать чтоб на момент подвисания программы появлялось окно с надписью, к примеру "Ждите идёт загрузка...", а после отвисания исчезало.
Ни как не могу понять с какой стороны подступится к данной проблеме.
Спасибо.
Записан
Serr500
Гость
Re: Окно загрузки данных
«
Ответ #1 :
Июнь 18, 2012, 14:36 »
Вытягивать данные в отдельном потоке. По окончании процесса генерировать сигнал. В GUI сделать таймер. Если после запуска запроса прошла секунда (100мс, 3 секунды, и т.п. - выбрать по вкусу. Можно и сразу, но при коротких запросах это будет некрасиво.), вывести окошко "Ждите...". Получив сигнал, похерить окошко.
Записан
vovan1982
Гость
Re: Окно загрузки данных
«
Ответ #2 :
Июнь 18, 2012, 15:38 »
А без второго потока ни как?
а то я с потоками не работал ни когда.
Записан
Serr500
Гость
Re: Окно загрузки данных
«
Ответ #3 :
Июнь 18, 2012, 15:47 »
Насколько мне известно, никак.
Записан
trot
Гость
Re: Окно загрузки данных
«
Ответ #4 :
Июнь 18, 2012, 15:50 »
Цитировать
А без второго потока ни как?
Никак.
Еще надо учитывать, такую особенность, что пользователь может своими действиями не дождавшись одного результата запроса, запустить следующий запрос и такми образом выстроить очередь запросов, ну так далее. Т.е. необходимо продумать политику реакции итерфейса на действия пользователя.
Записан
alexis031182
Гость
Re: Окно загрузки данных
«
Ответ #5 :
Июнь 18, 2012, 15:58 »
Цитата: vovan1982 от Июнь 18, 2012, 14:22
...
Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.
...
Может быть стоит подумать над оптимизацией кода взаимодействия программы с БД? Часто совершенно не имеет смысла переливать всю информацию из таблиц в память. Или в Вашем случае нужно именно так?
Записан
vovan1982
Гость
Re: Окно загрузки данных
«
Ответ #6 :
Июнь 18, 2012, 16:44 »
Цитата: alexis031182 от Июнь 18, 2012, 15:58
Цитата: vovan1982 от Июнь 18, 2012, 14:22
...
Есть программа которая вытягивает данные из mysql, пока данных в базе было мало всё было ок, но когда объём данных вырос то в процессе получения данных программа подвисает.
...
Может быть стоит подумать над оптимизацией кода взаимодействия программы с БД? Часто совершенно не имеет смысла переливать всю информацию из таблиц в память. Или в Вашем случае нужно именно так?
Полученные данные затягиваются в модель в которой из них строится дерево, пробовал реализовать fechMore() но в результате помимо подвисания при получении данных в начале, получил ещё подвисания при разворачивании каждой ветки дерева.
Вот и решил что самым оптимальным будет окошко с уведомлением, иначе кажется что прога тупо зависла.
«
Последнее редактирование: Июнь 18, 2012, 16:46 от vovan1982
»
Записан
vovan1982
Гость
Re: Окно загрузки данных
«
Ответ #7 :
Июнь 18, 2012, 16:46 »
Спасибо всем за ответы, буду учить потоки
Записан
alexis031182
Гость
Re: Окно загрузки данных
«
Ответ #8 :
Июнь 18, 2012, 17:21 »
Мне кажется, что вьюха всё же должна более плотно работать с моделью. Как-то в пустую тратятся ресурсы. Действительно, ну зачем гнать из модели во вьюху 1000 строк, если максимум штук 100 будет выведено. Если пользователь двинет ползунок прокрутки, значит только тогда и подгружать следующую порцию данных. А может так статься, что ползунок сместится на незначительное расстояние, что будет требовать ещё меньшего количества подгружаемых данных. В итоге - минимум тормозов, если таковые вообще возникнут.
А если ещё взглянуть в сторону веба, то там подобные проблемы решаются при помощи пагинации, часто вкупе с аяксом. Другими словами, выглядит более рационально. В чём я не прав?
Записан
vovan1982
Гость
Re: Окно загрузки данных
«
Ответ #9 :
Июнь 18, 2012, 17:31 »
Цитата: alexis031182 от Июнь 18, 2012, 17:21
Мне кажется, что вьюха всё же должна более плотно работать с моделью. Как-то в пустую тратятся ресурсы. Действительно, ну зачем гнать из модели во вьюху 1000 строк, если максимум штук 100 будет выведено. Если пользователь двинет ползунок прокрутки, значит только тогда и подгружать следующую порцию данных. А может так статься, что ползунок сместится на незначительное расстояние, что будет требовать ещё меньшего количества подгружаемых данных. В итоге - минимум тормозов, если таковые вообще возникнут.
На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Записан
mutineer
Гость
Re: Окно загрузки данных
«
Ответ #10 :
Июнь 18, 2012, 17:36 »
Цитата: vovan1982 от Июнь 18, 2012, 17:31
У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран. Вот и не грузи все остальные сразу, а только когда вьюха их запросит. Или, что еще лучше, загружай немножко больше, чем нужно вьюхе, и подгружай по мере приближения запросов к границе загруженных данных
Записан
alexis031182
Гость
Re: Окно загрузки данных
«
Ответ #11 :
Июнь 18, 2012, 17:54 »
Цитата: vovan1982 от Июнь 18, 2012, 17:31
На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
Если данных очень много, то вполне ожидаемо, что будут тормоза. Под это дело выделяется память. И помимо собственно самих табличных данных, выделяется память и под всякого рода "служебную" инфу. Всё это безусловно нужно, но нужно ли всё сразу, вот в чём вопрос.
Цитата: vovan1982 от Июнь 18, 2012, 17:31
У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Боюсь, что решения у меня для Вас нет. Здесь нужен гуру кьютишного Model/View (я больше в другой области). Просто когда-то давно, ещё на первых версиях четвёрки (Qt4) я делал фронтэнд к менеджеру пакетов для Linux. Тоже был вьювер, тоже была модель, тоже куча позиций, измеряемых десятками тысяч. Единственное, в роли БД выступало API пакетного менеджера, но суть задачи сводилась к тому же, что и у Вас. Стоило мне всех их загружать разом, так сразу возникали жуткие GUI-тормоза. Поэтому я сделал решение, логику которого описал в посте выше, т.е. частичную подгрузку. И всё стало шикарно работать. Во время подгрузки новых позиций, если пользователь шнырял ползунком прокрутки туда-сюда, нужные итемы всегда довольно быстро подгружались.
Как я это сделал - не помню, да и к сожалению код у меня не сохранился. Вроде там была реализована плотная связка между моделью и вьювером, то есть каждый знал о состоянии каждого. Конечно, это вроде как нарушение принципа Qt MV, но такое частное решение позволило обойтись без потоков и работало весьма сносно.
Записан
alexis031182
Гость
Re: Окно загрузки данных
«
Ответ #12 :
Июнь 18, 2012, 17:55 »
Цитата: mutineer от Июнь 18, 2012, 17:36
Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема
Записан
mutineer
Гость
Re: Окно загрузки данных
«
Ответ #13 :
Июнь 18, 2012, 18:04 »
Цитата: alexis031182 от Июнь 18, 2012, 17:55
Цитата: mutineer от Июнь 18, 2012, 17:36
Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема
Конечно непонятно - кода ведь нет
«
Последнее редактирование: Июнь 18, 2012, 18:06 от mutineer
»
Записан
vovan1982
Гость
Re: Окно загрузки данных
«
Ответ #14 :
Июнь 18, 2012, 20:02 »
Цитата: mutineer от Июнь 18, 2012, 18:04
Цитата: alexis031182 от Июнь 18, 2012, 17:55
Цитата: mutineer от Июнь 18, 2012, 17:36
Вьюха ведь у модели спрашивает не все данные разом, а только попадающие на экран
...
Тем более тогда непонятно, почему возникла эта проблема
Конечно непонятно - кода ведь нет
Исходник модели
.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
Цитата: alexis031182 от Июнь 18, 2012, 17:54
Цитата: vovan1982 от Июнь 18, 2012, 17:31
На данном этапе тормоза возникают именно при выборке данных из БД, а на счёт постепенной загрузки данных во вьюху, это как?
Если данных очень много, то вполне ожидаемо, что будут тормоза. Под это дело выделяется память. И помимо собственно самих табличных данных, выделяется память и под всякого рода "служебную" инфу. Всё это безусловно нужно, но нужно ли всё сразу, вот в чём вопрос.
Цитата: vovan1982 от Июнь 18, 2012, 17:31
У меня есть модель, я выбираю данные из БД, потом эти данные выстраиваю в дерево и как потом мне передавать во вьюху не все данные, я что то не понимаю, можно пример?
Боюсь, что решения у меня для Вас нет. Здесь нужен гуру кьютишного Model/View (я больше в другой области). Просто когда-то давно, ещё на первых версиях четвёрки (Qt4) я делал фронтэнд к менеджеру пакетов для Linux. Тоже был вьювер, тоже была модель, тоже куча позиций, измеряемых десятками тысяч. Единственное, в роли БД выступало API пакетного менеджера, но суть задачи сводилась к тому же, что и у Вас. Стоило мне всех их загружать разом, так сразу возникали жуткие GUI-тормоза. Поэтому я сделал решение, логику которого описал в посте выше, т.е. частичную подгрузку. И всё стало шикарно работать. Во время подгрузки новых позиций, если пользователь шнырял ползунком прокрутки туда-сюда, нужные итемы всегда довольно быстро подгружались.
Как я это сделал - не помню, да и к сожалению код у меня не сохранился. Вроде там была реализована плотная связка между моделью и вьювером, то есть каждый знал о состоянии каждого. Конечно, это вроде как нарушение принципа Qt MV, но такое частное решение позволило обойтись без потоков и работало весьма сносно.
Жаль что у вас не осталось исходников было бы интересно взлянуть на реализацию, думаю не только мне
.
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...