-
Генерирую изображения несколько тысяч. В результате чего заканчивается Handle. Меньше генерировать не получается.
Выход освободить Bitmap.Dormant
Но после этой функции не работает ScanLine.
Вопрос как починить?
-
Они тебе прямо вот все одновременно несколько тысяч нужны? Может позле генерации закрывать хэндл, и открывать сгенерированное только по необходимости?
-
Одновременно не нужны.
Bitmap.Dormant и закрывает.
Вопрос как открыть с генерировать?
-
Разрушай объекты - мой юный падаван :)
-
Пробовал через потоки, но они сильно тормозят код.
Второй решение это HandleNeeded
После генерации вызываю Bitmap.Dormant.
Для восстановления достаточно вызвать HandleNeeded, только она protected.
Но проблема в том что она не всегда срабатывает. Может кто знает в чём дело?
Может как-то лимит хэндлов можно увеличить? Раз в 10 меня бы устроило.
> Разрушай объекты - мой юный падаван :)
Мы не ищем простых путей. :)
Перейти на собственный класс без хэндлов не проблема, просто имена классов поменяю. Плюс часть кода скопипастить придётся.
Хочется всё же снять ограничения у существующего кода.
-
гм? Разве несколько тысяч исчерпают лимит Handle? Сколько конкретно их у вас з0хавано?
Под Bitmap имеется ввиду VCL.Graphics.TBitmap?
А для чего вам вообще столько отдельных дескрипторов? Предположу - вы просто насоздавали гору TBitmap, а они побочно занимают сколько-то Handle?
Как насчёт не создавать гору, а лишь парочку достаточно больших?
-
6*11*4*36=9504 изображений Хотелось бы в 10 раз больше.
> Под Bitmap имеется ввиду VCL.Graphics.TBitmap?
У меня старый проект на D7. А так да TBitmap из VCL, вернее там небольшая обёртка над ним.
Если есть смысл перейти на XE10 то можно попробовать.
> Как насчёт не создавать гору, а лишь парочку достаточно
> больших?
Это не красиво всю архитектуру попортит. Я же говорю в таком случае мне проще перейти на другой класс где вообще нет хэндлов.
-
Какая операционная система? Кто конкретно и какую ошибку выдаёт?
Почему же не красиво? И как так "испортит"? :)
type
TBitmapChip = record
Bitmap: TBitmap; // Pointer
X, Y, W, H: Integer; // ClipRect
end;
-
> Pavia © (08.01.18 18:22) [6]
> 6*11*4*36=9504 изображений Хотелось бы в 10 раз больше.
Мдя...
-
-
Сегодня вам надо 9504, завтра вам надо 38016, а через неделю 114048.
Хотя я и не представляю для чего может понадобится
одновременно 9504 именно
отдельных хэндлов битмапов...
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspx
Однозначно поможет TBitmapChip. Можете переименовать его в TBitmapSprite. :)
Один хэндл, десятки/сотни спрайтов. Бонусом будет возможное ускорение загрузки с диска/сети.
-
"Пробовал через потоки, но они сильно тормозят код."
-
> Однозначно поможет TBitmapChip. Можете переименовать его в TBitmapSprite.
- что-то ( 6*11*4*36 ) мне подсказывает, что они одинакового размера...
Ипользуй Image List, Люк.
З.Ы. И можно не переименовывыть в Sprite - наложения, маски - там всё есть, включая стандартный механизм отрисовки Drag&Drop...
-
сделать большой битмап с регионами предлагать? вместо 10-100 небольших? обвязки, конечно, будет, но ничего невозможного.
-
Уже ж предлагал выше. С:
И не факт что одинакового размера, это могут быть папки/подпапки или типа классификации чего-либо.
-
Как вариант - можно использовать GDI+.
-
1. Что-то не правильно делаешь.
2. Сделать свой TBitmap.
3. Использовать большие битмапы.