crossplatform.ru

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

Elfinit
  опции профиля:
сообщение 17.3.2009, 14:15
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

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




Репутация:   1  


Вобщем, ситуация такая. Прога для создания фотоальбомов.
Основной функциональный элемент - это собсно область просмотра фоток (QGraphicsView, в которую грузится некий наследник QGraphicsScene).
В области отображаются миникопии фоток. Прокрутка, просмотр каждой, одновременное масштабирование всех (как в пикасе например) - это всё более или менее есть.
Проблема в следующем:
Альбомов, само собой, может быть несколько. Ооочень хочется чтобы каждый альбом (хотя бы те первые фотки, которые должны быть сейчас видны) отображались моментально. Что происходит при открытии альбома и как поставлено сейчас:
1. Очищается текущий выбранный альбом (картинки на сцене и некоторые служебные объекта, выграженные из БД). Уже тут - можно ли это выделить в отдельный поток?
2. Запускается поток для загрузки фоток (п1)
3. В п1 из базы запрашиватся фотки выбранного альбома (количество и собственно фотки).
4. В п1 запускается поток п2, который будет заполнять миникопии собственно изображениями.
5. В п1 вычисляются размеры сцены с учётом текущего размера миникопии, количества фоток (строк и столбцов на сцене), размеров окна и т.п., всё это отправлется грубо говоря сцене, типа "на, готовься".
6. В перебираются все строки, полученные из базы, формируются объекты-PhotoData (перечисление свойств и т.п.), сразу после формирования отправляются сцене для формирования заготовки для миникопии (вообще, миникопия на сцене - это некий наследник QGraphicsPixmapItem). В поток п2 отправляется требование создать нужные картинки для миникопии.
7. п2 формирует (точнее, считывает с диска, они уже были созданы при добавлении фоток в альбом) 2 изображения - плохое и хорошее. 2 нужно для быстрого масштабирования, суть не в этом. Формирует значит 2 штуки QImage и отправляет ссылки сцене, типа "вставь в такую-то заготовку".
И так пока не кончается фотки.

Что происходит:
Поскольку формирование "заготовок" (пустых миникопий) происходит очень быстро, пользовательский интерфейс "замораживается" до тех пор, пока не сформируется всё (не успевает "отлипнуть" после очередной). Подгрузка изображений - тут проблем уже не возникает, пользовательский интерфейс доступен и постепенно все заготовки заполняются (как в Windows в режиме "эскизы страниц"). К тому же, на случай, если заготовка стала видна, но ещё не подгружено изображение, оно подгружается "форсированно" основным потоком. Т.о. гарантируется, что первые фотки, которые должны быть сразу видны, будут загружены. Проблема, повторяюсь, в "замораживании" пользовательского интерфейса на время формирования заготовок, разметки сцены. Проблема принципиальна для большого числа фоток. Так, для полутора тысяч заморозка происходит на 7-10 секунд.
Qt не позволяет "ковыряться" в UI из других потоков, поэтому приходится заниматься пересылками данных м/у потоками. К тому же, при получении картинок надо из QImage делать QPixmap, т.к. в дочерних потоках "опасно" работать с QPixmap.

И ещё - для QGraphicsView сделал отрисовку OpenGL, это не сильно ускорило процесс.

Вот как-то так. Для наглядности прилагаю скрин окна.
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 41%
Прикрепленное изображение
448 x 313 (38.16 килобайт)
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2009, 17:11
Сообщение #2


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

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

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




Репутация:   94  


по опыту пользования смотрелок, как пользователь, я рассудил бы так:
процесс загрузки миниатюр, для картинок, должен быть паралелен, т.к. я могу в сотый раз в ходить в один и тот же каталог и зарание знать, что именно мне надо и где это примерно находится (сколько прокрутить линейку прокрутки в случае большого числа файлов). И я хочу иметь быструю навигацию (это не значит, что я хочу быстро увидеть все миниатюры).
Предположим, что я хочу попасть в такую точку в дереве:
\
|--folder_1
|     |--folder_2
|     |     |--file_2_1
|     |     .
|     |     .
|     |     .
|     |     |--file_2_105   -- Эту картинку хочу!
|     |     .
|     |     .
|     |     .
|     |     |--file_2_1305
|     |--file_1
|     .
|     .
|     .
|     |--file_1200
здесь видно, что я сначало вхожу в каталог folder_1, в котором 1200 файлов (по ним начинает строится миниатюры), а я почти сразу лезу в каталог folder_2, в котором 1305 файлов (по ним тоже начинают строится миниатюры), однако я прокручивю этот список к предпологаемому мету интерисующей меня миниатюры, следовательно процесс построения миниатюр должен иметь некий фокус - что стрить в первую очередь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Elfinit   QGraphicsScene + Изображения + Потоки   17.3.2009, 14:15
- - BRE   Я правильно понял, сначала на сцену добавляются пу...   17.3.2009, 14:25
- - Elfinit   Да, почти. Примерно так: while (q.next(...   17.3.2009, 14:46
|- - BRE   Цитата(Elfinit @ 17.3.2009, 14:46) CODE w...   17.3.2009, 14:52
- - Litkevich Yuriy   Elfinit, справка по кнопкам   17.3.2009, 14:51
- - Elfinit   Пробовал - никакого эффекта. 1326 фоток - "от...   17.3.2009, 14:59
|- - BRE   Цитата(Elfinit @ 17.3.2009, 14:59) Пробов...   17.3.2009, 15:05
- - Elfinit   В потоке1. В основном он создаётся: AlbumLoaderTh...   17.3.2009, 15:20
|- - BRE   Цитата(Elfinit @ 17.3.2009, 15:20) Добави...   17.3.2009, 15:34
- - Litkevich Yuriy   Цитата(Elfinit @ 17.3.2009, 17:15) пользо...   17.3.2009, 15:21
- - ViGOur   Уже не раз говорилось: ЦитатаЕсть замечательное пр...   17.3.2009, 15:43
|- - Elfinit   Цитата(ViGOur @ 17.3.2009, 15:43) Уже не ...   17.3.2009, 15:53
|- - BRE   Цитата(Elfinit @ 17.3.2009, 15:53) Двухст...   17.3.2009, 16:24
|- - Elfinit   Цитата(BRE @ 17.3.2009, 16:24) Цитата(Elf...   17.3.2009, 16:38
|- - BRE   Цитата(Elfinit @ 17.3.2009, 16:38) Но всё...   17.3.2009, 16:53
- - Litkevich Yuriy   по опыту пользования смотрелок, как пользователь, ...   17.3.2009, 17:11
|- - Elfinit   Litkevich Yuriy, Такая штука уже имеется - если по...   17.3.2009, 17:31
- - Litkevich Yuriy   Elfinit, нет нужды цитировать все мое сообщение   17.3.2009, 18:09


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 8.6.2025, 1:45