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

Вниз

Delphi 6. Обработка ошибок в Graphics   Найти похожие ветки 

 
DmitryShevelev ©   (2005-06-02 17:57) [0]

Win 2000 Professional.
Раз в неделю-две у каждого из моих операторов выскакивает EOutOfResources с разными сообщениями.
Ошибка генерится в TCustomForm.CreateWnd -> TCustomForm.GetIconHandle -> ... -> ReadIcon
после того, как CreateIcon возвращает 0.
Ту же ошибку нетрудно сгенерировать самостоятельно (освобождение объектов после возникновения ошибки опустим):

var
S : TMemoryStream;
begin
S := TMemoryStream.Create;
Application.Icon.SaveToStream(S);
repeat
 S.Seek(0, soFromBeginning);
 With TIcon.Create do begin
  LoadFromStream(S);
  Handle;
 end;
until false;
end;

Действительно достигается предел по ресурсам? У меня сложилось впечатление, что нет.

Во-первых, анализ GetLastError в ходе выполнения ReadIcon показывает, что ошибка, по которой формируется текст для EOutOfResources после того, как CreateIcon вернул 0, вообще не имеет никакого отношения к этой функции. В данном случае GetIcon вообще НЕ УСТАНАВЛИВАЕТ LastError. Код ошибки остаётся неизменным в ходе всего выполнения процедуры ReadIcon. Т.е., если отредактировать копию Graphics и добавить SetLastError(0) в начале ReadIcon, то после GetIcon = 0 ошибка так и будет нулевая.

Во-вторых, проверка ограничений на количество ресурсов даёт устойчивый результат (как для User-, так и для GDI-объектов): 10000 handle на приложение и 16000 на систему. Данная ошибка происходит, когда до этого ограничения далеко. Причем, в количестве handle на момент ошибки нет никакой системы. От пары тысяч до десяти тысяч для GDI-объектов и так же для User-объектов.

В-третьих, если перехватить ошибку в указанном выше цикле, цикл спокойно продолжается дальше. Пока будет достигнут реальный предел, та же ошибка может выскочить раз, два или не выскочить вообще. И только после достижения реального предела, создание объектов действительно становится невозможным.

Отладка копии Graphics показала, что предвестником проблемы является ошибка в другом месте ReadIcon (которая почему-то вообще не проверяется разработчиками). На три строчки выше GetIcon находится вызов GetBitmapBits(XorBits, XorLen, XorMem); В вызове, когда GetIcon возвращает 0, GetBitmapBits возвращает 0, т.е. не происходит копирование BitMap. GetLastError и в этом случает не показывает ошибку.

Интересно было бы услышать любые комментарии и предположения.
Интересует и вариант, как при создании формы вообще избежать этого кода.
В конце концов, мне всего-то нужно, чтобы программа не обижала операторов. :-)


 
alpet ©   (2005-06-03 10:47) [1]

Исключение EOutOfResources может возникать и в момент обработки исключения, когда механизм вывода ошибок пытается загрузить строку сообщения из ресурсов, но у него что-то не получается.

Для чего у тебя Handle обозначено  в коде - это же ReadOnly свойство класса TIcon, смысл его так выставлять? Судя по всему цикл должен быть безконечным, поэтому исключение не избежно. Попытайся потрасировать его отладчиком, от точки возникновения, может ситуация проясниться.


 
-=S.S=- ©   (2005-06-03 10:53) [2]

И частенько вы тем кодом пользуетесь ?
Не вижу у вас удаление переменной S


 
alpet ©   (2005-06-03 10:58) [3]

После трассировки выяснится что именно непонятно зачем выставленный в код handle вызывает данное исключение.



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

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

Наверх




Память: 0.48 MB
Время: 0.028 c
14-1120728878
IceBeerg
2005-07-07 13:34
2005.07.31
Антивирус NOD32 кто, что может сказать?


8-1111922435
seregka
2005-03-27 15:20
2005.07.31
Изменение качества при неизменном размере изображение


3-1119365537
Alex17
2005-06-21 18:52
2005.07.31
из базы данных в EXEL


1-1121089198
grusty
2005-07-11 17:39
2005.07.31
Какое сообщение возникает при изменении размера MDIChild формы...


14-1121076095
WondeRu
2005-07-11 14:01
2005.07.31
Вакансия: Программист (С++) как творец безопасности.