|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
||||||||||||||||
GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок?15.09.2016, 19:32. Показов 3099. Ответов 15
Метки c, delphi seattle, g, gdi+, gdiplus, gdipobj, seattle, thread, tpicture, tthread, twicimage, vcl, wic, windows imaging component, Поток, потоки, потоки и gdi, потоки и gdi+, потоки и gdiplus, потоки и twicimage, потоки и vcl (Все метки)
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в отдельном потоке происходит уменьшение картинки и её сохранение на диск. Из главного потока только сбор путей файлов, передача их в экземпляр потока, и его запуск.
Причем, если сделать тоже самое в главном потоке, либо сказать главному - чтобы дожидался дополнительного - всё работает. Вот код модуля потока
0
|
||||||||||||||||
| 15.09.2016, 19:32 | |
|
Ответы с готовыми решениями:
15
Вывод картинки на панель в отдельном потоке Объсните, почему значение переменной в отдельном потоке другое и как его поменять? |
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 15.09.2016, 22:17 [ТС] | |
|
Вас услышал, держите проект, там всё в кучу, я пробовал разные способы уменьшения изображения. Мне нужно такой, чтобы создал более менее приемлемый thumbnail, скажем 100*100, и создал его быстро, так как фотографий большого качества достаточно много.
TestDiminishPics.zip
0
|
|
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 15.09.2016, 22:19 [ТС] | |
|
Коды ошибок, вы имеете ввиду GetLastError? Или те, которые из обработки исключений?
Я просто ошибки отлавливаю через try except обычно, но в этом тестовом примере этого нет. Добавлено через 1 минуту После того как запустите - жмите на кнопку MultiGDIPlus - по ней можно всю цепочку отследить
0
|
|
|
|
||||||||
| 16.09.2016, 02:33 | ||||||||
|
Ну для начала вот тут:
В строке 15 вы запускаете поток B, а ещё чуть дальше ждёте WaitFor() завершения потока B. А что же с потерянным потоком A? Потом - почему вы в потоке вызываете методы формы VCL и её компонентов где и как попало? Что за TWICImage?
У меня например вообще вылетает в трубу при TBitmap.Assign(TWICImage), не уверен из-за потоков или нет, так как не работал с этой фигнёю. Добавлено через 10 минут У вас и у формы и у потока есть метод с одинаковым именем GDIplusDiminishPic - зачем? Путаться в них? Содержимое правда не сравнивал. Но почему вы в потоке пытаетесь лезть в метод формы, когда у потока свой такой же? Добавлено через 2 минуты
Добавлено через 48 минут Переделал с TWICImage на TPicture, ибо не ведаю особенностей первого. Было немного лень, и просто объявил новую переменную, поменял на неё где надо. В итоге вышло что TWICImage просто создавался (ничего ниоткуда не загружая) и удалялся в finally через FreeAndNil. И знаете чего? При вызове из потока оно залипало насмерть на FreeAndNil ! Выкинул к чертям TWICImage, стало работать без "заморозки". Но это не значит что остальное можно так и оставить. З.Ы. может стоит отфильтровывать ещё и файлы содержащие "_thumb", а то у меня оно нарожало файлы вида "11_thumb_thumb_thumb.BMP".
0
|
||||||||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|||||||||||||||||||||||||||||||||||
| 16.09.2016, 15:14 [ТС] | |||||||||||||||||||||||||||||||||||
|
))))))))))
Полный разбор полетов! Спасибо. Видно, да, что я тороплюсь)))) Щас переделаю и отпишусь. Добавлено через 58 минут По поводу создания 2 потоков - да, моя ошибка. Там должен был создаваться только один.
Я с GDI+ 2 день работаю, поэтому не знал многих вещей, в частности, как с помощью неё загружать изображения из файлов разных форматов, а twic вроде как знаком был. То есть вы загружаете в TPicture? Примерно таким образом?
Добавлено через 49 минут В общем, походил я с отладчиком, проблема следующая -Если в основном потоке сделать так...
Почему так происходит? LoadFromFile не срабатывает? Добавлено через 32 секунды Собственно отсюда и все остальные проблемы - картинка не поступает для дальнейшей обработки Добавлено через 12 минут Думал что то с синхронизацией. Добавил критическую секцию - но видимо дело не в этом. Суть в том, что картинка не загружается в методе LoadFormFile в дополнительном потоке... Добавлено через 46 минут Переписал через StretchDraw - заработало,
В общем, вот что... получилось... Код работает... Можно там поработать с качеством, скоростью, но мою задачу он решил, и я пока движусь далее, но если кому понадобится... Запуск потока...
0
|
|||||||||||||||||||||||||||||||||||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
||||||||||||||||
| 16.09.2016, 15:23 [ТС] | ||||||||||||||||
|
В общем, вот что... получилось... Код работает... Можно там поработать с качеством, скоростью, но мою задачу он решил, и я пока движусь далее, но если кому понадобится...
Запуск потока...
В итоге я ушел от GDI+, использовал обычный StretchDraw. С GDI+ появлялись белые прямоугольники, постоянно, вместо картинок, насколько я раскопал, проблема в
На этом данную тему для себя закрываю. Всем удачи в кодинге !!! P.S. Кстати, как тут поменять ник? Писал в админку - тишина.
0
|
||||||||||||||||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 16.09.2016, 15:27 [ТС] | |
|
Прикладываю прожект
TestDiminishPics.7z
0
|
|
|
|
||
| 16.09.2016, 16:52 | ||
|
У меня работало через GDI+ вполне нормально. Посмотрю проект чуть позже. Может есть смысл создать новый проект и частями аккуратно перенести в него код из первого, чтоб ничего лишнего не было.
0
|
||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|||||||||||
| 17.09.2016, 01:12 [ТС] | |||||||||||
|
Да, я понял уже, но позже, что можно было напрямую грузить в нее. А GDI+ мощная штука!!! Со временем разберусь.
Пронаблюдал интересное явление, вот в этой процедурке
0
|
|||||||||||
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
|
|||
| 17.09.2016, 02:10 | |||
|
В первой строчке кода метода Execute потока идет обращение к компоненту VCL формы
0
|
|||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 17.09.2016, 02:13 [ТС] | |
|
0
|
|
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
|
|
| 17.09.2016, 02:19 | |
|
0
|
|
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 17.09.2016, 02:21 [ТС] | |
|
В каких же, интересно, допустимы исключения?
0
|
|
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
|
||
| 17.09.2016, 02:30 | ||
|
Ну на всякий случай. В двух словах этот вопрос не объяснить.
0
|
||
|
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
|
|
| 17.09.2016, 02:50 [ТС] | |
|
0
|
|
| 17.09.2016, 02:50 | |
|
Помогаю со студенческими работами здесь
16
Загрузка в ImageView картинки по ссылке в отдельном потоке. Исправить код Как реализовать генерацию события в основном потоке? Как вызвать асинхронную функцию в основном потоке и дождаться результата ? При запуске метода с параметром делегатом в отдельном потоке виснет все приложение Как записать строку созданную в основном потоке в texbox работающем в backgroundworker? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|