Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EStackOverflow [D5, NT4, Win2k]


Страницы:   1 2

Дуся ©   (2002-10-23 13:35:00) 

Господа!.. Хочется рыдать уже, но все равно не поможет...

Программа вдруг ни с того ни с сего выдает EStackOverflowвнутри процедуры, выполняющейся в отдельном thread. Ладно если бы просто вываливала exception, но затем она просто тихо закрывает приложение. Хотя блок try..exceptотрабатывает - в логе об этом есть запись.
Процедура самая обычная, обходит список и что-то с каждым элементом делает или не делает в зависимости от статуса. Длина списка порядка 300 элементов. Вызывается за день кучу раз - примерно каждые 2 секунды.
Такой ошибки не встречала раньше никогда.
Вопроса два: с чего бы это, и можно ли как-то это так отлавливать
чтобы она все не роняла!..
Помогите!..
Приложение онлайновое, жутко важное, топор близится.. :(


Дуся   (2002-10-23 14:25:00) [21]

а где?..
Внутри одного из вызываемых методов?..
но тогда там бы и валилось - там тоже проверок наставлено сверх меры...


Opuhshii   (2002-10-23 14:19:00) [22]

лажа скорее всего не здесь,...


Дуся   (2002-10-23 14:14:00) [23]

Вот... Если кому понятно что-то вообще...


Дуся   (2002-10-23 14:12:00) [24]

procedure TInstrOperator.CheckDataBase;
Var
i : integer;
LCount : integer;
begin
try
if InsideList = nil then exit;
LCount := InsideList.Count - 1;
StatusForm.FIProgress.Max:=LCount+1;
StatusForm.AllFI.caption:= IntToStr(LCount+1);

if NoNewFI and NoNewQueue then
exit;

WriteToLogFile("TInstrOperator.CheckDataBase. Lcount = "+IntToStr(LCount));
for i := 0 to LCount do
begin
WorkInstr := InsideList.Items[i];
if WorkInstr <> nil then
begin
if (WorkInstr.Board < 0){ or (WorkInstr.Board > 4) }then
begin
if WorkInstr.Board <> 11 then continue;
end;

if WriteInitToBase then
if not WorkInstr.InitOnDataBase then WorkInstr.InitDataBase;

if WorkInstr.InitOnDataBase then
if not WorkInstr.OnDataBase then WorkInstr.ToDataBase;

WorkInstr.SequenceToDataBase;
StatusForm.FIProgress.Position := i;
StatusForm.I1.Caption := IntToStr (i+1);
end;
end;
StatusForm.FIProgress.Position := StatusForm.FIProgress.Max;
StatusForm.FIProgress.Position := 0;
StatusForm.i1.Caption := "";

except
on E:Exception do
WriteToLogFile("TInstrOperator.CheckDataBase " + E.ClassName+":"+E.Message);
end;

end;


Игорь Шевченко   (2002-10-23 14:04:00) [25]

Код в студию. Телепатов здесь нету


Дуся   (2002-10-23 13:57:00) [26]

Рекурсии йок.
В хелпе написано "либо рекурсия, либо очень большие локальные переменные" (extremely large local variables) - это как так - очень большие?!..
и почему валится-то не на каждом проходе, а от балды ?..


Opuhshii   (2002-10-23 13:53:00) [27]

Рекурсия у Вас,
"просто тихо закрывает приложение" - правильно,. почитайте Рихтера поймете почему,.. это очень правильно... ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо