Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.103 c
1-1121025994
mmms
2005-07-11 00:06
2005.07.31
Как "распутать" обратный путь в TTreeView у TTreeNode


14-1120814531
NickMan
2005-07-08 13:22
2005.07.31
Зашифрованная картинка.


5-1091566662
boband
2004-08-04 00:57
2005.07.31
Stack overflow - save your work and restart Delphi


4-1116411956
lehich
2005-05-18 14:25
2005.07.31
кодировка и clipboard


4-1116811498
boalse
2005-05-23 05:24
2005.07.31
Узнать серийный номер винта (не тома)....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский