Конференция "Media" » Нехватка Handle
 
  • Pavia © (07.01.18 20:25) [0]
    Генерирую изображения несколько тысяч. В результате чего заканчивается 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. Использовать большие битмапы.
 
Конференция "Media" » Нехватка Handle
Есть новые Нет новых   [134427   +29][b:0][p:0]