Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Нехватка Handle


Pavia ©   (07.01.18 20:25

Генерирую изображения несколько тысяч. В результате чего заканчивается Handle. Меньше генерировать не получается.

Выход освободить Bitmap.Dormant
Но после этой функции не работает ScanLine.

Вопрос как починить?


Rouse_ ©   (07.01.18 20:57[1]

Они тебе прямо вот все одновременно несколько тысяч нужны? Может позле генерации закрывать хэндл, и открывать сгенерированное только по необходимости?


Pavia ©   (07.01.18 21:26[2]

Одновременно не нужны.
Bitmap.Dormant и закрывает.
Вопрос как открыть с генерировать?


Rouse_ ©   (08.01.18 01:36[3]

Разрушай объекты - мой юный падаван :)


Pavia ©   (08.01.18 13:46[4]

Пробовал через потоки, но они сильно тормозят код.
Второй решение это HandleNeeded
После генерации вызываю Bitmap.Dormant.
Для восстановления достаточно вызвать HandleNeeded, только она protected.
Но проблема в том что она не всегда срабатывает. Может кто знает в чём дело?

Может как-то лимит хэндлов можно увеличить? Раз в 10 меня бы устроило.


> Разрушай объекты - мой юный падаван :)

Мы не ищем простых путей. :)
Перейти на собственный класс без хэндлов не проблема, просто имена классов поменяю. Плюс часть кода скопипастить придётся.

Хочется всё же снять ограничения у существующего кода.


Вайрекс   (08.01.18 16:34[5]

гм? Разве несколько тысяч исчерпают лимит Handle? Сколько конкретно их у вас з0хавано?
Под Bitmap имеется ввиду VCL.Graphics.TBitmap?

А для чего вам вообще столько отдельных дескрипторов? Предположу - вы просто насоздавали гору TBitmap, а они побочно занимают сколько-то Handle?
Как насчёт не создавать гору, а лишь парочку достаточно больших?


Pavia ©   (08.01.18 18:22[6]

6*11*4*36=9504 изображений Хотелось бы в 10 раз больше.


> Под Bitmap имеется ввиду VCL.Graphics.TBitmap?

У меня старый проект на D7.  А так да TBitmap из VCL, вернее там небольшая обёртка над ним.
Если есть смысл перейти на XE10 то можно попробовать.


> Как насчёт не создавать гору, а лишь парочку достаточно
> больших?

Это не красиво всю архитектуру попортит. Я же говорю в таком случае мне проще перейти на другой класс где вообще нет хэндлов.


Вайрекс   (08.01.18 19:44[7]

Какая операционная система? Кто конкретно и какую ошибку выдаёт?

Почему же не красиво? И как так "испортит"? :)
type
   TBitmapChip = record
       Bitmap: TBitmap; // Pointer
       X, Y, W, H: Integer; // ClipRect
   end;


Rouse_ ©   (09.01.18 02:06[8]


> Pavia ©   (08.01.18 18:22) [6]
> 6*11*4*36=9504 изображений Хотелось бы в 10 раз больше.

Мдя...


Pavia ©   (09.01.18 06:02[9]

HandleCount2:=GetGuiResources(GetCurrentProcess, 0);
Число выделенных ресурсов совпадает с числом изображений.
ОС Win7-64 придел наступает около 10 000.

Судя по MSDN придел должен быть 64 000
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683192(v=vs.85).aspx

Поможет тут манифест?


Вайрекс   (11.01.18 03:03[10]

Сегодня вам надо 9504, завтра вам надо 38016, а через неделю 114048.
Хотя я и не представляю для чего может понадобится одновременно 9504 именно отдельных хэндлов битмапов...
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspx

Однозначно поможет TBitmapChip. Можете переименовать его в TBitmapSprite. :)
Один хэндл, десятки/сотни спрайтов. Бонусом будет возможное ускорение загрузки с диска/сети.


Это лайк!   (11.01.18 15:13[11]

"Пробовал через потоки, но они сильно тормозят код."


han_malign ©   (12.01.18 13:14[12]


> Однозначно поможет TBitmapChip. Можете переименовать его в TBitmapSprite.

- что-то ( 6*11*4*36 ) мне подсказывает, что они одинакового размера...
Ипользуй Image List, Люк.

З.Ы. И можно не переименовывыть в Sprite - наложения, маски - там всё есть, включая стандартный механизм отрисовки Drag&Drop...


Дмитрий Белькевич ©   (16.01.18 18:38[13]

сделать большой битмап с регионами предлагать? вместо 10-100 небольших? обвязки, конечно, будет, но ничего невозможного.


Вайрекс   (16.01.18 20:26[14]

Уже ж предлагал выше. С:

И не факт что одинакового размера, это могут быть папки/подпапки или типа классификации чего-либо.


Прохосый   (21.06.18 16:34[15]

Как вариант - можно использовать GDI+.


K-1000 ©   (16.07.18 19:43[16]

1. Что-то не правильно делаешь.
2. Сделать свой TBitmap.
3. Использовать большие битмапы.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо