![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедуры вылетают без ошибок
Krolm © (2008-11-05 06:52:00)В достаточно крупном приложении произвольно вылетают процедуры. То есть доходит до какой-то строчки, потом в подпрограмме при построковой отладке брейк прыгает на строчку end; и выходит из всех подпрограмм на самый высокий уровень. Никаках сообщений об ошибках. Если есть try finally блоки - finally обрабатывается нормально.
Типичные процедуры, после которых вылетает:
s:=StringReplace(s,#13#10,#9,[rfReplaceAll]);
sl.add(s); (sl:TstringList);
При этом если такие "проблемные" процедуры заменить на другие попроще, например MessageBox(0,@s[1],'',0); Все отрабатывается без проблем.
Сначала помогло увеличение размера стека + директива компилятора inline. Поток стал отрабатывать без проблем. Но такая же ерунда возникла в основной программе, в процедуре сохранения StringGrid в файл. Не могу найти причину. Что может быть?
ОС Vista, CodeGear™ RAD Studio 2007 Version 11.0.2902.10471
Krolm (2008-11-06 08:31:00) [21]По вопросам: 2 потока. 1 - интерфейс. 2 - работа с сетью.
try
s:=StringReplace(s,#13#10,#9,[rfReplaceAll]);
except
on e:exception do
Messagebox(0, PChar(e.classname + ' ' + e.Message), '', mb_ok or mb_setforeground); // <- что дословно написано в тексте сообщения ?
end;
Никаких исключительных ситуаций не возникает. Но я все таки нашел причину.
При создании формы на событии OnShow висело выравнивание ширины колонок. И был там код наподобие следующиего:
for i:= main.Colcount to main.ColCount+5 do
main.Colwidths[i]:=-1;
main.Colcount была представлена в виде константы, и при изменении структуры таблицы (столбцов стало меньше) я не отловил что происходит бред и вообще обращение к тем объектам, которых не существует.
У меня остается вопрос, почему софт не сыпался на этом этапе. А сыпался потом, когда уже работал даже не со StringGrid ом.
Германн (2008-11-06 02:25:00) [22]Ох уж эти доппотоки! :(
Чур меня!
Loginov Dmitry (2008-11-05 23:03:00) [23]> То есть доходит до какой-то строчки, потом в подпрограмме
> при построковой отладке брейк прыгает на строчку end; и
> выходит из всех подпрограмм на самый высокий уровень. Никаках
> сообщений об ошибках. Если есть try finally блоки - finally
> обрабатывается нормально.
Это все в доп. потоке? Тогда какие сообщения об ошибках ожидаются? Поток грохается просто, вот и все. Тут необходимо перехватывать исключение, как в [1].
Leonid Troyanovsky (2008-11-05 16:05:00) [24]
> Krolm © (05.11.08 06:52)
> В достаточно крупном приложении произвольно вылетают процедуры.
IsMultiThread = True?
--
Regards, LVT.
Anatoly Podgoretsky (2008-11-05 16:01:00) [25]> KSergey (05.11.2008 13:29:05) [5]
В которой наверно и происходит ошибка и поток слетает, вместе с приложением. Особенно если гдето есть except end;
KSergey (2008-11-05 13:29:00) [26]> Anatoly Podgoretsky © (05.11.08 13:04) [3]
> > Поток стал отрабатывать без проблем.
Я это читал, от того и последнйи вопрос.
Но может чел. имел ввиду что-то другое? Но если тама еще и многопоточность....
Anatoly Podgoretsky (2008-11-05 13:05:00) [27]> Поток стал отрабатывать без проблем.
Anatoly Podgoretsky (2008-11-05 13:04:00) [28]> Поток стал отрабатывать без проблем.
KSergey (2008-11-05 12:25:00) [29]Это наблюдается только в отладчике?
StringList точно создан до использования?
Приложение однопоточное или многопоточное?
Сергей М. (2008-11-05 10:58:00) [30]try
s:=StringReplace(s,#13#10,#9,[rfReplaceAll]);
except
on e:exception do
Messagebox(0, PChar(e.classname + ' ' + e.Message), '', mb_ok or mb_setforeground); // <- что дословно написано в тексте сообщения ?
end;