![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ViGOur |
![]()
Сообщение
#11
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Уже не раз говорилось:
Цитата Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект. Ты наверняка не следовал этому правилу. ![]() Потому и происходит подвисание из-за загрузки картинок не во второстепенном, а в главном потоке. |
|
|
Elfinit |
![]()
Сообщение
#12
|
Участник ![]() ![]() Группа: Участник Сообщений: 127 Регистрация: 17.3.2009 Из: Казань Пользователь №: 619 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Уже не раз говорилось: Цитата Есть замечательное правило, слот выполняется в том потоке, в котором был создан его объект. Ты наверняка не следовал этому правилу. ![]() Потому и происходит подвисание из-за загрузки картинок не во второстепенном, а в главном потоке. Объект сцены создаётся в основном потоке и photoReady пересылается на него. Объект-наследник QGraphicsPixmapItem (который выше известен как ThumbnailItem) создаётся именно там. Во второстепенном потоке его создавать нельзя (понятно,почему). Создаётся он изначально без картинки и просто добавляется на сцену. Пересылка в основной поток объектов QImage проблем и зависаний не вызывает. А загрузка их происходит во второстепенном потоке (поток2). Добавил в цикл
Действительно, успевает отмёзрнуть - менее чем через секунду (причём независимо от размера альбома) всё становится доступным. Но это, по-моему, не совсем элегантное лечение. Я думаю происходит следующее: Поток AlbumLoaderThread очень быстро эмитет сигнал photoReady, т.к. сигналы идут между потоками, они превращаются в события, которые кладутся в очередь главного потока. При переключении на главный поток, за отведенное время все эти события не успевают обработаться, после этого происходит опять переключение на поток AlbumLoader и он напихивает очередную партию события и т.д. Включения msleep улучшает положение, но это не выход, т.к. на некоторых машинах этого времени будет много и поток будет простаивать, а на другой мало и опять получаться тормоза. Можно попробовать сделать двух стороннее информирование, т.е. AlbumLoader отправил партию картинок и ждет пока главный поток, не сообщит ему, что они все добавлены на сцену. Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать? А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени? |
|
|
BRE |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать? А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени? Вычислять ничего не надо. Например, можно попробовать так: AlbumLoader лочит мьютекс и готовит один ряд эскизов, после этого освобождает мьютекс и посылает сигнал "Блок картинок готов". Главный поток, после получения сигнала, лочит тот же мьютекс и начинает добавлять эскизы в сцену, после освобождает мьютекс. Т.е. пока мьютекс залочен в главном потоке (добавляются картинки на сцену), второй будет ожидать завершение этого процесса. |
|
|
Elfinit |
![]()
Сообщение
#14
|
Участник ![]() ![]() Группа: Участник Сообщений: 127 Регистрация: 17.3.2009 Из: Казань Пользователь №: 619 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Двухсторонне информирование это типа отправил N фоток (а как определить это N) и уснул либо на M мсек (а как его определить?), либо до тех пор, пока основной поток не сообщит, что снова готов принимать? А можно как-то оценить (определить,вычислить), сколько событий может обработать поток в заданный промежуток времени? Вычислять ничего не надо. Например, можно попробовать так: AlbumLoader лочит мьютекс и готовит один ряд эскизов, после этого освобождает мьютекс и посылает сигнал "Блок картинок готов". Главный поток, после получения сигнала, лочит тот же мьютекс и начинает добавлять эскизы в сцену, после освобождает мьютекс. Т.е. пока мьютекс залочен в главном потоке (добавляются картинки на сцену), второй будет ожидать завершение этого процесса. Спс, интересно,надо попробовать)) Но всё-таки надо же как-то оценивать количество картинок, которое должно быть в блоке....А если удастся получить такую оценку, то можно просто усыплять поток на некоторое время через каждые N отправленных photoReady |
|
|
BRE |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Но всё-таки надо же как-то оценивать количество картинок, которое должно быть в блоке....А если удастся получить такую оценку, то можно просто усыплять поток на некоторое время через каждые N отправленных photoReady Ты попробуй: один ряд, три ряда, все видимые, ... Небольшая поправочка: Наверное лучше не блокировать поток AlbumLoaderThread на все время добавления картинок на сцену, пусть он создает объекты PhotoData, а когда их наберется на новый блок, лочить мьютекс, добавлять в коллекцию, освобождает мьютекс и отсылает сигнал. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#16
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
по опыту пользования смотрелок, как пользователь, я рассудил бы так:
процесс загрузки миниатюр, для картинок, должен быть паралелен, т.к. я могу в сотый раз в ходить в один и тот же каталог и зарание знать, что именно мне надо и где это примерно находится (сколько прокрутить линейку прокрутки в случае большого числа файлов). И я хочу иметь быструю навигацию (это не значит, что я хочу быстро увидеть все миниатюры). Предположим, что я хочу попасть в такую точку в дереве: здесь видно, что я сначало вхожу в каталог folder_1, в котором 1200 файлов (по ним начинает строится миниатюры), а я почти сразу лезу в каталог folder_2, в котором 1305 файлов (по ним тоже начинают строится миниатюры), однако я прокручивю этот список к предпологаемому мету интерисующей меня миниатюры, следовательно процесс построения миниатюр должен иметь некий фокус - что стрить в первую очередь.
|
|
|
Elfinit |
![]()
Сообщение
#17
|
Участник ![]() ![]() Группа: Участник Сообщений: 127 Регистрация: 17.3.2009 Из: Казань Пользователь №: 619 Спасибо сказали: 7 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy, Такая штука уже имеется - если пользователь прокрутит сцену до места, где картинки ещё не подгрузились, они загружаются в эскиз "форсированно", тупо в paint (у каждого эскиза есть флаг isLoaded, если он false, то подгружается)
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Elfinit, нет нужды цитировать все мое сообщение
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 6.6.2025, 13:43 |