![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EStackOverflow [D5, NT4, Win2k]
Дуся © (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]Рекурсия у Вас,
"просто тихо закрывает приложение" - правильно,. почитайте Рихтера поймете почему,.. это очень правильно... ;)