crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
ViGOur
  опции профиля:
сообщение 17.3.2009, 15:43
Сообщение #11


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Уже не раз говорилось:
Цитата
Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект.
Ты наверняка не следовал этому правилу. :)

Потому и происходит подвисание из-за загрузки картинок не во второстепенном, а в главном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 17.3.2009, 15:53
Сообщение #12


Участник
**

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

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




Репутация:   1  


Цитата(ViGOur @ 17.3.2009, 15:43) *
Уже не раз говорилось:
Цитата
Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект.
Ты наверняка не следовал этому правилу. :)

Потому и происходит подвисание из-за загрузки картинок не во второстепенном, а в главном потоке.


Объект сцены создаётся в основном потоке и photoReady пересылается на него. Объект-наследник QGraphicsPixmapItem (который выше известен как ThumbnailItem) создаётся именно там. Во второстепенном потоке его создавать нельзя (понятно,почему). Создаётся он изначально без картинки и просто добавляется на сцену. Пересылка в основной поток объектов QImage проблем и зависаний не вызывает. А загрузка их происходит во второстепенном потоке (поток2).

Цитата(BRE @ 17.3.2009, 15:34) *
Цитата(Elfinit @ 17.3.2009, 15:20) *
Добавил в цикл
msleep(10);

Действительно, успевает отмёзрнуть - менее чем через секунду (причём независимо от размера альбома) всё становится доступным. Но это, по-моему, не совсем элегантное лечение.

Я думаю происходит следующее:
Поток AlbumLoaderThread очень быстро эмитет сигнал photoReady, т.к. сигналы идут между потоками, они превращаются в события, которые кладутся в очередь главного потока. При переключении на главный поток, за отведенное время все эти события не успевают обработаться, после этого происходит опять переключение на поток AlbumLoader и он напихивает очередную партию события и т.д.
Включения msleep улучшает положение, но это не выход, т.к. на некоторых машинах этого времени будет много и поток будет простаивать, а на другой мало и опять получаться тормоза.
Можно попробовать сделать двух стороннее информирование, т.е. AlbumLoader отправил партию картинок и ждет пока главный поток, не сообщит ему, что они все добавлены на сцену.


Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать?
А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.3.2009, 16:24
Сообщение #13


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

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

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




Репутация:   44  


Цитата(Elfinit @ 17.3.2009, 15:53) *
Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать?
А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени?

Вычислять ничего не надо.
Например, можно попробовать так:
AlbumLoader лочит мьютекс и готовит один ряд эскизов, после этого освобождает мьютекс и посылает сигнал "Блок картинок готов".
Главный поток, после получения сигнала, лочит тот же мьютекс и начинает добавлять эскизы в сцену, после освобождает мьютекс.
Т.е. пока мьютекс залочен в главном потоке (добавляются картинки на сцену), второй будет ожидать завершение этого процесса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 17.3.2009, 16:38
Сообщение #14


Участник
**

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

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




Репутация:   1  


Цитата(BRE @ 17.3.2009, 16:24) *
Цитата(Elfinit @ 17.3.2009, 15:53) *
Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать?
А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени?

Вычислять ничего не надо.
Например, можно попробовать так:
AlbumLoader лочит мьютекс и готовит один ряд эскизов, после этого освобождает мьютекс и посылает сигнал "Блок картинок готов".
Главный поток, после получения сигнала, лочит тот же мьютекс и начинает добавлять эскизы в сцену, после освобождает мьютекс.
Т.е. пока мьютекс залочен в главном потоке (добавляются картинки на сцену), второй будет ожидать завершение этого процесса.

Спс, интересно,надо попробовать))
Но всё-таки надо же как-то оценивать количество картинок, которое должно быть в блоке....А если удастся получить такую оценку, то можно просто усыплять поток на некоторое время через каждые N отправленных photoReady
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 17.3.2009, 16:53
Сообщение #15


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

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

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




Репутация:   44  


Цитата(Elfinit @ 17.3.2009, 16:38) *
Но всё-таки надо же как-то оценивать количество картинок, которое должно быть в блоке....А если удастся получить такую оценку, то можно просто усыплять поток на некоторое время через каждые N отправленных photoReady

Ты попробуй: один ряд, три ряда, все видимые, ...

Небольшая поправочка:
Наверное лучше не блокировать поток AlbumLoaderThread на все время добавления картинок на сцену, пусть он создает объекты PhotoData, а когда их наберется на новый блок, лочить мьютекс, добавлять в коллекцию, освобождает мьютекс и отсылает сигнал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2009, 17:11
Сообщение #16


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

Группа: Сомодератор
Сообщений: 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
  опции профиля:
сообщение 17.3.2009, 17:31
Сообщение #17


Участник
**

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

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




Репутация:   1  


Litkevich Yuriy, Такая штука уже имеется - если пользователь прокрутит сцену до места, где картинки ещё не подгрузились, они загружаются в эскиз "форсированно", тупо в paint (у каждого эскиза есть флаг isLoaded, если он false, то подгружается)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2009, 18:09
Сообщение #18


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

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

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




Репутация:   94  


Elfinit, нет нужды цитировать все мое сообщение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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