Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Проблема с работой с TBitmap.   Найти похожие ветки 

 
Дмитрий Белькевич   (2006-01-31 02:23) [0]

Есть ли какие-либо особенности использования tbitmap"а в потоках? Какие-то глюки совсем неясной природы, до белый экран вместо картинки, то нехватка системных ресурсов при savetofile, хотя я этих русурсов почти не потребляю, то выдаёт "не могу сохранить файл - файл уже присутствует на диске". Вообще не представляю, откуда глюки берутся. Битмапы средние по размеру - около 1000х1000, честный dib, просто два локальных битмапа в процедуре.


 
Джо ©   (2006-01-31 02:31) [1]

> Проблема с работой с TBitmap.
> Дмитрий Белькевич   (31.01.06 02:23)
> Есть ли какие-либо особенности использования tbitmap"а в
> потоках?

Главная особенность, конечно, в том, что TBitmap не потокобезопасный класс. Не происходит ли обращение к методам и свойствам одного экземпляра TBitmap из разных потоков?


 
Defunct ©   (2006-01-31 02:50) [2]

Глюки берутся из GDI..
по потокобезопастности TBitmap"a могу сказать, что проблем никогда с этим не замечал. А вот при изменении размера расходуется GDI ресурс причем катастрофически.
Один из возможных вариантов лечения: использовать MemoryStream вместо второго TBitmap"a.. если не поможет - тогда сокращать размер...

PS: как проверяли, что он честный dib? Глюки свидетельствуют об обратном.


 
Германн ©   (2006-01-31 03:08) [3]


> Defunct ©   (31.01.06 02:50) [2]
>
> Глюки берутся из GDI..

Давно не встречал. В 9х были, но в сабже ХР.

А вот "белый экран вместо картинки", упомянутый в сабже, наводит на мысль! Пока правда не очень чёткую.:(


 
Дмитрий Белькевич   (2006-01-31 04:52) [4]


> Не происходит ли обращение к методам и свойствам одного
> экземпляра TBitmap из разных потоков?


Битмапы - локальные, внутри метода потока, наружу не торчат вообще. Потока один экземпляр, хотя в случае локальных разницы быть не должно.


> что он честный dib


Имелось в виду pf24bit, безо всяких извратов, из-за которых всякое вылазит.


> Глюки берутся из GDI..


Это понятно, не понятно - что ему под xp-то не хватает, ладно - 98, у неё с пулом ограниченным гемор, а тут - что?


> А вот при изменении размера расходуется GDI ресурс


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

В одном месте откопал выход за границу массива пикселей (вернее, сканлинии) при заполнении битмапа. Индекс на единицу больше края был, так и думал, что часть глюков - из-за памяти, хотя повключал range check, не помогло, руками пришлось, больно место подозрительное. Прибил - белые картинки перестали вылазить, out of resource всё равно при savetofile вылазит.

Вылазит на строчке

     Save := GDICheck(SelectObject(FCanvas.FHandle, FDIBHandle));

в graphics.pas.


 
Defunct ©   (2006-02-02 02:15) [5]

>> что он честный dib
> Имелось в виду pf24bit, безо всяких извратов, из-за которых всякое вылазит.

у TBitmap есть метод DibNeeded или типа того (уже не помню), его хорошо бы вызвать сразу после создания (перед изменением размера).

> Это понятно, не понятно - что ему под xp-то не хватает, ладно - 98, у неё с пулом ограниченным гемор, а тут - что?

В xp похоже тоже самое, только ограничения другие.


 
Sapersky   (2006-02-02 13:12) [6]

Использовать TFastDIB, у которого GDI можно отключить вообще (битмап в этом случае - область памяти, выделенная GetMem) - это, конечно, совершенно неприемлемый вариант? :)


 
DVM ©   (2006-02-02 16:16) [7]

Были как то подобные глюки у меня. Вылечил тем что блокировал канву битмапа перед любыми операциями с битмапом и разблокировал после.


 
Eraser ©   (2006-02-02 17:46) [8]


> Дмитрий Белькевич

так же глянь в сторону GdiFlush... а вообще скорее всего ошибки в алгоритме.



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
2-1140079171
kvz
2006-02-16 11:39
2006.03.05
OpenService


2-1140011423
Ice
2006-02-15 16:50
2006.03.05
Виртуальный TCanvas и его фоновый цвет...


15-1139559511
Jappak
2006-02-10 11:18
2006.03.05
ДБгрид


2-1140088176
PoetOfDelphi
2006-02-16 14:09
2006.03.05
Событие OnDblClick для LookUpComboBox


15-1139324718
Человек
2006-02-07 18:05
2006.03.05
LPT порт