Форум: "Потрепаться";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
ВнизEOutOfResources Найти похожие ветки
← →
Piter © (2004-05-23 14:08) [0]Ловлю баг в программе, возникает периодически :(
Но вот тут добился, что одна и таже последовательность действий приводит к ошибке.
Непосредственно ошибка возникает в такой функции:var
i:integer;
begin
setlength(ArrForm, length(ArrForm)+1);
i:=High(ArrForm);
ArrForm[i]:=TMDIChild.Create(MainForm); // Ошибка
гдеArrForm: TArrayMDIChild;
TArrayMDIChild = array of TMDIChild ;
TMDIChild соответствено Child форма, MainForm - главная форма (приложение MDI).
Ошибку пишет такую:EOutOfResources with message "Дочерние окна не могут иметь меню"
Никак не могу понять - что криминального в этих строчках. Если у кого есть какие предположения - высказывайтесь.
Абсолютно не понимаю почему EOutOfResource, формы всего две.
В VCL ошибка начинается в процедуре ReadIcon.Icon := CreateIcon(HInstance, IconSize.X, IconSize.Y,
XorInfo.bmPlanes, XorInfo.bmBitsPixel, AndMem, XorMem);
if Icon = 0 then GDIError;
Вот Icon как раз 0, вызывается GDIError и выводится ошибка...
P.S. Не надо спрашивать зачем нужен ArrForm. Нужен и все.
← →
Piter © (2004-05-23 21:19) [1]Ну неужто никаких идей, скажите хоть что-нибудь
← →
Polevi © (2004-05-23 21:27) [2]FormStyle ?
← →
Anatoly Podgoretsky © (2004-05-23 21:36) [3]Трудно отвечать, поскольку спрашивать запрещаешь.
← →
Piter © (2004-05-23 23:18) [4]Polevi (23.05.04 21:27) [2]
FormStyle ?
А что с ним не так?
У MainForm он fsMDIForm, у TMDIChild он fsMDIChild
Anatoly Podgoretsky (23.05.04 21:36) [3]
Трудно отвечать, поскольку спрашивать запрещаешь
Вы про ArrForm? ну нужен он мне, какая разница зачем? Ведь можно же так сделать, ничего криминального нету? Массив форм, что такого...
Я не про эффективность программы, я про ошибку - почему она вылезает?
Тем более такая странная... не хватает ресурсов... а еще точнее CreateIcon приводит к ошибке. Что за нафиг?
← →
Cobalt © (2004-05-24 01:41) [5]И на каком количестве дочрних окон это происходит?
Или же ошибка происходит в создании, а не в массиве?
Что у тебя в OnCreate TMDIChild?
Попробуй создать тестовый примерчик работы с MDI - код тот же самый в том, что касается создания и удаления. Будут ошибки?
← →
Piter © (2004-05-24 19:59) [6]Cobalt (24.05.04 01:41) [5]
И на каком количестве дочрних окон это происходит?
на абсолютно разном. Когда как... не в том дело, видимо...
Cobalt (24.05.04 01:41) [5]
Или же ошибка происходит в создании, а не в массиве?
я указал на какой строчке происходит ошибка. Также я указал, где в недрах VCL происходит ошибка...
Cobalt (24.05.04 01:41) [5]
Что у тебя в OnCreate TMDIChild?
одна строчка:procedure TMDIChild.FormCreate(Sender: TObject);
begin
Sock:=nil;
end;
ГдеSock: TMySock;
TMySock
это класс для управления передачей информации по сети. В любом случае, он здесь не при чем.
Cobalt (24.05.04 01:41) [5]
Попробуй создать тестовый примерчик работы с MDI - код тот же самый в том, что касается создания и удаления. Будут ошибки?
конечно, нет! Тут то ошибка происходит черт знает по каким числам.
Я просто не знаю что думать. Может, проверить состояние каких-нибудь переменных или еще чего. Ведь ошибка возникает при вызове WinApi функции CreateIcon... что же делать...
← →
Piter © (2004-05-24 22:05) [7]Народ, помогайте! А то я удавлюсь...
← →
Cobalt © (2004-05-24 23:17) [8]Ну, что могу посоветовать - удаляй из проекта разные компоненты пока не избавишься от ошибки. А как найдёшь - с каким компонентом ошибка выскакивает - начинай отлаживать.
P.S. используешь где низкоуровневые(WinAPI) функции?
P.P.S. и не "помогайте", а помогите.
← →
Polevi © (2004-05-24 23:18) [9]конструктор TMDIChild
← →
Polevi © (2004-05-24 23:19) [10]заодно проверь не перегружен ли CreateParams
← →
Piter © (2004-05-24 23:52) [11]Polevi (24.05.04 23:18) [9]
конструктор TMDIChild
чего? Я не понял. Обработчик OnCreate я привел...
А конструктор, естественно, от TCustomForm. Как у формы можно конструктор перекрыть...
Polevi (24.05.04 23:19) [10]
заодно проверь не перегружен ли CreateParams
я не перегружал... значит, не перегружен.
Cobalt (24.05.04 23:17) [8]
Ну, что могу посоветовать - удаляй из проекта разные компоненты пока не избавишься от ошибки
ты так шутишь? И что удалять? Может, без форм обойтись?
Cobalt (24.05.04 23:17) [8]
А как найдёшь - с каким компонентом ошибка выскакивает - начинай отлаживать.
я уже говорил, что ошибка возникает в вызове WinApi функции CreateIcon, она возвращает ноль, то есть неудачный вызов.
GetLastError дает"EOutOfResources with message "Дочерние окна не могут иметь меню"
Я согласен, что это у меня дочернее окно. Но про какое меню идет речь? Там у дочерних форм есть PopUp меню... даже два их... но почему она не может их иметь? Странности какие-то
P.S. Чувствую, в ФИДО мне нужно... или вот попробую задать вопрос на "Королевстве"...
← →
nikkie © (2004-05-25 00:34) [12]>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса.
>ты так шутишь? И что удалять? Может, без форм обойтись?
никаких шуток. создай новое MDI-приложение, где написан тот код, который ты здесь привел. ошибки нет? значит ошибка вызвана не им, а чем-то другим в твоем проекте. бери проект с ошибкой и вычищай оттуда все подряд, пока не оставишь голые формы или пока ошибка не исчезнет. сделал минимальный проект - выложи для всеобщего доступа.
← →
Piter © (2004-05-25 09:48) [13]nikkie (25.05.04 00:34) [12]
элементарно. также как и у любого другого класса
да? Приведи пример :)
nikkie (25.05.04 00:34) [12]
создай новое MDI-приложение, где написан тот код, который ты здесь привел. ошибки нет? значит ошибка вызвана не им, а чем-то другим в твоем проекте
ты понимаешь, что ошибка возникает раз в сто обращений. МожетЮ даже реже. Активно работает с базой данных. Результаты работы выносит на форму...
Что вычищать? Что удалять? Удалив хоть немного, приложение станет неработоспособным... тестировать его будет невозможно... (как можно тестировать неработающее приложение?)
Не тупо же создавать и удалять эти формы?
← →
DiamondShark © (2004-05-25 13:57) [14]
> тестировать его будет невозможно
Ещё невозможнее тестировать приложение с миллионом функций.
Если у тебя нет архива версий, то откатиться до последней стабильной конфигурации нельзя. Тебе предлагают единственный возможный выход -- исключать функциональность до получения стабильной программы. Пусть она будет состоять на 90% из пустышек и заглушек. Но ты хоть как-то очертишь круг возможных причин. Иначе можно до потери пульса медитировать над строчкой, где происходит исключение, и так и не добиться просветления. Пойми, что исключение -- это последнее следствие возможно очень большого количества причин.
← →
Piter © (2004-05-25 18:15) [15]DiamondShark (25.05.04 13:57) [14]
исключать функциональность до получения стабильной программы
а как ее тестировать?!?! Просто открывать окна? И ничего в них не отображать?
← →
Cobalt © (2004-05-25 18:46) [16]> Просто открывать окна? И ничего в них не отображать?
Совершенно верно. Об этом и велась речь (заглушки).
← →
Piter © (2004-05-25 20:16) [17]Cobalt (25.05.04 18:46) [16]
> Просто открывать окна? И ничего в них не отображать?
Совершенно верно. Об этом и велась речь (заглушки).
глупо. Посмотрите на код. Он же верный, элементарный. Ну поставлю я его в цикл? Сделает он 100 окон, поток закроет... и что?
← →
nikkie © (2004-05-25 21:08) [18]>Посмотрите на код. Он же верный, элементарный.
посмотрели. ошибок в нем нет. значит, ошибка где-то в другом месте. что дальше?
← →
Piter © (2004-05-25 23:51) [19]nikkie (25.05.04 21:08) [18]
посмотрели. ошибок в нем нет. значит, ошибка где-то в другом месте. что дальше?
эх, это ты меня спрашиваешь что дальше? Послушай, Николай, ты раздражен моим ответом?
Я ведь не знаю в чем причина, в чем ошибка. Я описал ошибку, я выложил что раскопал, ну что я еще могу сделать?
Ошибка пренеприятнейшая, выскакивает очень периодически. Помнишь, ты сам говорил, что у тебя иногда в программе выскакивает AV (в DMClient"е, по-моему). Вот это по типу такой ошибки, только возникает почаще, я так понимаю.
Ну что можно сказать? Знал бы в чем дело - ликвидировал.
Вы предлагаете убрать некие составляющие. Но это нереально. Вы видели код создания MDI окна? Он простейший, естественно, я и не думал, что причина в нем.
Значит, ошибка в другом месте кода, а кода много. Все не выложишь.
И почему я задал вопрос - для меня остается непонятным что за ошибка.EOutOfResources with message "Дочерние окна не могут иметь меню"
даже тип ошибкиEOutOfResources
никак не клеится с расшифровкой"Дочерние окна не могут иметь меню"
.
Если не могут - так это не то, чтобы не хватает ресурсов, это должен быть другой тип ошибки.
И сама фраза"Дочерние окна не могут иметь меню"
- ну ведь нету там никаких меню...
Я первый раз сталкиваюсь, чтобы CreateIcon возвращала ноль. Потому и спрашиваю, ведь кто-то может наблюдал это, может у него есть хоть какие-то зарисовки на тему почему так получается.
Может, нужно проверить какие-то параметры, передаваемые в какую-нибудь функцию, я же не знаю. Я не в состоянии трассировать каждую выполняемую строчку в дебаггере.
И тут еще одна неприятность произошла. Я нашел последовательность действий, которая всегда приводила к ошибке, слава богу хоть что-то постоянное. Но вот с недавних пор это уже не приводит к ошибкe. После перезагрузки что ли изменилось? Мистика, в общем...
Мне пока в голову пришло только одно, коли уж ошибка редко вылезает, то тупо эмулировать действие пользователя. Цикл что ли какой хитроумный написать, ну типа пользователь жмет на кнопку - выполняется процедура. А мне из цикла самому эти процедуры вызывать, как будто пользователь работает. И все это поставить работать непрерывно, должна же ошибка вылезать...
В общем, писать под программу комплекс тестирования. Но хлопотное это дело, если у кого есть какие соображения - я бы лучше их выслушал...
← →
Piter © (2004-05-26 18:52) [20]Никто ничего не скажет?
← →
nikkie © (2004-05-26 20:01) [21]>Ошибка пренеприятнейшая, выскакивает очень периодически. Помнишь...
понимаю это прекрасно. ошибки такие ловить тяжело. и простого пути тут нет. а ты ставишь вопросы так, как будто хочешь, чтобы твою проблему кто-то другой решил. отсюда и раздражение, которое ты заметил в моем посте. извини, постараюсь такого не допускать. но и тебе бы хорошо на разумные советы не отвечать "глупо. Посмотрите на код."
медитация на приведенным кодом ничего не даст. наверное, надо верить Дельфи - проблема действительно в нехватке ресурсов. Особенно, если после разового возникновения этой ошибки, она возникает постоянно до перезапуска программы, скажем.
честно говоря, не знаю тула, которым можно было бы отследить используемые ресурсы. когда-то под 98-ми пользовался программкой Resource Meter - если программа небрежно обращалась с ресурсами, то это было заметно. если проблема с ресурсами и ты можешь запустить программу под 9x - ошибка станет очевиднее.
заметь, что ты даже не описал, с чем именно работает твоя программа. по оброненным тобой фразам понятно, что там есть работа с базой и сокетами. могу предположить, что в ней есть также WebBrowser. если с ним ты обращаешься где-то неаккуратно, то вполне возможна утечка из-за него.
← →
Cobalt © (2004-05-26 20:14) [22]Пропробуй использовать MemProof - может у тебя где утечка
Используешь где низкоуровневые(WinAPI) функции?
Может, хуки есть какие (например, от сторонних программ)?
← →
Piter © (2004-05-26 22:51) [23]nikkie (26.05.04 20:01) [21]
Особенно, если после разового возникновения этой ошибки, она возникает постоянно до перезапуска программы
да, так и есть,но думаю из-за того, что программа просто стала неправильно работать. При попытке продолжить работу она зависает, выкидывает AV и т.д.
nikkie (26.05.04 20:01) [21]
наверное, надо верить Дельфи - проблема действительно в нехватке ресурсов
ну Дельфи тут вообще не при чем. Я уже говорил несколько раз, что ошибка начинается с CreateIcon, она возвращает ноль. И после нее GetLastError возвращает такую строчку с ошибкой... так что можно доверять Windows, а я ей не доверяю :)
Насчет нехватки ресурсов - да не может быть, ошибка может проявиться в первую минуту работы. Один раз кликнуть по теме, откроется ВТОРОЕ окно и ошибка будет. А может долго работать с закрытием/открытием множества окон и без всяких ошибок...
nikkie (26.05.04 20:01) [21]
заметь, что ты даже не описал, с чем именно работает твоя программа
да собственно говоря это Magic Forum :)
Зря я, наверное, сказал, ибо теперь ты не будешь помогать :( получается, своими руками конкурентов плодишь...
nikkie (26.05.04 20:01) [21]
могу предположить, что в ней есть также WebBrowser. если с ним ты обращаешься где-то неаккуратно, то вполне возможна утечка из-за него
опять же, почему проявляется то в начале программы, то может долго работать без всяких утечек?
Cobalt (26.05.04 20:14) [22]
Используешь где низкоуровневые(WinAPI) функции?
сосбтвенноручно не использую.
Cobalt (26.05.04 20:14) [22]
Может, хуки есть какие (например, от сторонних программ)?
нету
Я вот чего совсем не понимаю, почему CreateIcon возвращает ноль? Ну вот уперлось мне это... думаю, если понять почему - дальше можно строить умозаключения.
Может кто привести пример, чтобы CreateIcon возвращала ноль? Это сколько же программа должна сожрать памяти, чтобы не удалось выполнить CreateIcon? Аналогичная ситуация с CreateWindow - не могу представить сколько надо создать окон, чтобы она вернула ноль. Даже в Win95 можно создать более 16000 окон... думаю, иконок можно создать не меньше...
все мне было бы понятно, если бы не "нехватка ресурсов". Ну черт побери - когда не хватает ресурсов, машина хоть бы тормозить стала что ли... ничего подобного...
Я вот блин не догадался проверить какие параметры передаются в функцию CreateIcon, может они неправильные, функция возвращает ноль, а GetLastError просто возвращает некорректную ошибку, просто глюк windows? Бывает же такое
P.S. Кстати, Nikkie, ты не правил EmbeddedNS в последнее время? А то может ты исправил глюк там какой...
← →
Piter © (2004-05-26 22:52) [24]Вот, кстати, ответ на королевстве:
setlength(ArrForm, length(ArrForm)+1);
i:=High(ArrForm);
ArrForm[i]:=TMDIChild.Create(MainForm); // Ошибка
подобным образом создавал массив объектов,
глючило, пока не сделал в другом порядке
TempObject:=TObject.Create;
setlength(ObjectsArray,length(ObjectsArray)+1);
ObjectsArray[length(ObjectsArray)-1]:=TempObject;
По-моему, это уже шаманство какое-то, но я к нему готов...
← →
Игорь Шевченко © (2004-05-26 23:08) [25]
> Может кто привести пример, чтобы CreateIcon возвращала ноль?
>
SysErrorMessage(GetLastError) в студию.
← →
nikkie © (2004-05-26 23:24) [26]>Piter
на все твои вопросы "почему" я ответить не могу. и не хочется гадательством заниматься. одна попытка - если не получиться угадать в чем твоя проблема, то тебе один путь - см. [14] DiamondShark
и вот попытка: у тебя в коде есть код типа WebBrowser.Document?
>да собственно говоря это Magic Forum :)
да я, собственно, догадываюсь. про WebBrowser я не просто так сказал. ты просто учитывай, что не все как я знают, какого рода программу ты пишешь и на какой операционной системе тестируешь. так что когда задаешь вопрос, то не лишним будет описать программу и ОС.
>ты не правил EmbeddedNS в последнее время?
первое и последнее (пока) изменение(* v1.01 03/04/2004 NA *)
(* A problem with thread creation is fixed. *)
(* The problem sometimes resulted in AV. *)
>Вот, кстати, ответ на королевстве:
и после этого говорят, что на королевстве уровень отвечающих выше :))
ну попробуй пошаманить, вдруг получится.
← →
Piter © (2004-05-30 18:12) [27]up
← →
RealRascal © (2004-05-30 22:16) [28]
> Cobalt (24.05.04 23:17) [8]
> Ну, что могу посоветовать - удаляй из проекта разные компоненты
> пока не избавишься от ошибки
>
> ты так шутишь? И что удалять? Может, без форм обойтись?
А это действительно может быть дельной мыслью. У меня как-то было такое - написал основной код, начал занимаца приукрашательством, удобства всякие навешивать, батончики, мемошки...
И вот тут фигня какая-то (мистическая прямо таки:)) стала происходить:
Кладешь на форму чекбокс, компилишь, запускаешь на вычисления - AV.
Убираешь чекбокс, копмилишь, запускаешь на вычисления - все ок.
Никаких изменений в коде, событий на чекбокс никаких, просто - AV и все тут! Хоть ты тресни! Так я до истины не докопался, времени небыло, надо было курсач расчитывать, плюнул я на это и без чекбокса этого обошелся. А народ в этом форуме мне говорил, что это из-за использования указателей (или что-то там вроде этого). Еще говорили про Range Checking, но мне это не помогло...
← →
kombat © (2004-05-31 01:21) [29]2 RealRascal ©
Это да, иногда такие непонятки возникают. Кинул на форму JvPopupMenu, никакого кода на нем нет. И при закрытии приложения с незакрытой формой с JvPopupMenu вылазит AV. Заменил на обычный PopupMenu - все пришло в норму.
Это конечно не мистика, все как-то объясняется, но ...
← →
Piter © (2004-05-31 18:30) [30]nikkie (25.05.04 00:34) [12]
>Как у формы можно конструктор перекрыть...
элементарно. также как и у любого другого класса
Nikkie, ты так и не привел примера!
← →
kombat © (2004-05-31 18:35) [31]constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AParent: TWinControl); reintroduce; overload;
===================================================
constructor TfrmBIT_BaseForm.Create(AOwner: TComponent);
begin
FAsChild := False; { форма не внедренная, базовый конструктор }
inherited Create(AOwner);
end; { end of Create }
//************************************************
constructor TfrmBIT_BaseForm.Create(AOwner: TComponent; AParent: TWinControl);
begin
FAsChild := True; { форма внедренная, переопределенный конструктор }
FTempParent := AParent;
inherited Create(AOwner);
end; { end of Create }
← →
Piter © (2004-05-31 18:48) [32]А
TfrmBIT_BaseForm = class(TForm)
?
← →
kombat © (2004-05-31 18:53) [33]TfrmBIT_BaseForm = class(TForm)
и такое есть, но чуть выше в файле )))
или под перекрытием конструктора что-то другое имелось ввиду?
← →
Piter © (2004-05-31 18:59) [34]kombat (31.05.04 18:53) [33]
и чего, пример работает?
← →
kombat © (2004-05-31 19:05) [35]конечно, эта идея взята из С.Тейксейра, К.Пачеко - Delphi 5 Руководство разработчика 1. Если вызываем переопределенный конструктор в передаем ему AParent = TPanel, то созданная форма становится внедренной в этот TPanel. Естестенно для этого нужно описать еще пару процедурок типа CreateParams, но основная идея с конструктором.
Это кстати кусок из работающего проекта.
← →
Piter © (2004-05-31 19:10) [36]kombat (31.05.04 19:05) [35]
Если вызываем переопределенный конструктор в передаем ему AParent = TPanel, то созданная форма становится внедренной в этот TPanel. Естестенно для этого нужно описать еще пару процедурок типа CreateParams, но основная идея с конструктором
Просто Nikkie говорил, что:>элементарно. также как и у любого другого класса
вот мне кажется, что не так, как у любого класса...
← →
kombat © (2004-05-31 19:17) [37]может и не так как у любого класса, но переопределяется ))
Из-за отсутствия у меня теоретического образования как программиста, более точно сказать не могу ((
← →
nikkie © (2004-05-31 22:32) [38]детский сад, блин...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
constructor TForm1.Create(AOwner: TComponent);
begin
ShowMessage("aaa");
inherited;
end;
end.
← →
Gero © (2004-05-31 22:43) [39]
> [38] nikkie © (31.05.04 22:32)
> детский сад, блин...
Точно.
← →
kombat © (2004-05-31 23:14) [40]а в чем детский сад?
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.036 c