Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-1087480688
olhovik
2004-06-17 17:58
2004.07.04
Вывод из Table в Memo


14-1087207564
Fireman
2004-06-14 14:06
2004.07.04
Интеграция C++ в Delphi7


1-1087151057
@Kidman
2004-06-13 22:24
2004.07.04
Классы и их потомки


3-1086586603
Denis_Visma
2004-06-07 09:36
2004.07.04
FastReport: отчет зеброй


1-1087312803
Ivolg
2004-06-15 19:20
2004.07.04
Имя





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский