| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Создание миниатюр в ListView |
| Автор: TechnoMag 14.10.2013, 17:16 |
| При выборе папки с изображениями могут создаться все миниатюры, для все файлов, а иногда бывает, что файлы пропускаются. Не пойму: проблема в реализации потока, или в компоненте? Пробовал на Win7 x64 и WinXp x32. Просьба указать проблемные места в коде. Прикрепляю файл проекта XE2. |
| Автор: Illusion Dolphin 14.10.2013, 17:32 | ||||||
Не рекомендуется в потоке вызывать
Не рекомендуется пользоваться канвой в потоке |
| Автор: TechnoMag 14.10.2013, 18:25 |
| А как быть, если нужно, чтобы окно приложения не подвисало во время создания большого кол-ва миниатюр? С ProcessMessages в основном потоке все равно программа немного подвисает. З.Ы. FTempBMP и FNewImage не привязаны к окну, и получается, что рисование происходит в памяти, а потом, синхронизированно, добавляются в ListView. |
| Автор: Illusion Dolphin 14.10.2013, 18:30 | ||||||
OwnerData = true это раз. Ещё синхронизация - это долгий и нудный процесс, поэтому данные из потока лучше выдавать пачками, и в каждой пачке делать
И что? Canvas не рассчитано на многопоточность. |
| Автор: TechnoMag 23.10.2013, 19:55 | ||
| Эффект тот же: иногда "рисуются" "пустые" миниатюры в ListView. Про выдачу данных пачками пока опускаем - нужно сначала понять, что мешает добавляться всем миниатюрам в список.
|
| Автор: Illusion Dolphin 24.10.2013, 00:15 | ||
Сложно сказать наверняка, давайте я прокоментирую пару строчек, а вы потом ещё опишите, как выглядят пустые изображения (всегда пустое или если перегрузить директорию - грузится? какой цвет у изображения? не может ли быть такое что 2 потока одновременно грузят изображение в 1 лист?)
Да и способ на 100% - постепенно выносить из потока в Synchronize фугкция за функцию и вы найдёте то, что ищете |
| Автор: TechnoMag 24.10.2013, 12:03 | ||||
Пустое изображение содержит только название файла, область, где должна быть миниатюра таким же цветом как и фон ListView. Грузит изображения только один поток. Если перезагрузить директорию изображения могут загрузиться.
Ну да, сыпать иронией, этот так по умному - сразу будет всем видно, что человек что-то знает и понимает, а главное - знает какими способами еще можно найти причину неполадки. |
| Автор: MetalFan 24.10.2013, 12:40 |
| странная логика - вынос в synchronize самой ресурсоемкой операции... я бы заюзал GDI+, полностью в отдельном треде. с передачей данных в/из него в memory stream или tbytes. |
| Автор: Illusion Dolphin 24.10.2013, 17:15 | ||||
Как я понимаю - это временно до выяснения причины "пробелов" в загрузке
Вы зря иронизируете. Проблема в реализации внутри VCL (в котором также есть баги), которая может меняться от версии к версии как минимум и в http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Graphics_TBitmap.html нет чётких данных про thread-safe для каждого метода. Вам, наверное, ещё не приходилось удалять из большого проекта 99% кода, чтобы найти сбойный участок, который может быть ну очень неочевиден. P.S. У меня в подписи ссылка на сайт с программой - попробуйте установите и откройте в ней вашу папку с фотографиями. Если вам понравится, то я могу вам помочь. |
| Автор: WERITAS 21.5.2017, 11:03 |
| Поднимаю тему! Столкнулся с такой же проблемой: миниатюра в потоке криво формируется. Билдил код автора и смотрел как выполняется - у меня такой же эффект. Как это победить? Решение найдено! |