![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа со строками приводит к ошибкам при выделении памяти [D5, D7, Win95/98]
MegaVolt © (2006-12-28 16:34:00)Многократный вызов нижеприведёённого кода приводит к проблемам с выделением памяти и нестабильной работе программы. Может ли быть такое и как можно решить эту проблему.
LogFile:TFileStream;
procedure TLog.StartF(Str: string);
var
s:string;
begin
if not Enabled then Exit;
s:='<'+IntToStr(GetTickCount-StartTime)+':'+str+#13+#10;
LogFile.Write(s[1],Length(s));
// FlushFileBuffers(LogFile.Handle);
end;
Допускаю что дело не в этой функции а во вносимых ею задержках. Но как тогда искать в чём проблема?
isasa (2006-12-28 23:43:00) [21]Попробуй
procedure TLog.StartF(Str: string);
var
s:string;
begin
if not Enabled then Exit;
<мультимедийный таймер>.Disable;
s:='<'+IntToStr(GetTickCount-StartTime)+':'+str+#13+#10;
LogFile.Write(s[1],Length(s));
// FlushFileBuffers(LogFile.Handle);
<мультимедийный таймер>.Enable;
end;
Sha (2006-12-28 18:12:00) [22]Т.к. мультимедийный таймер работает в отдельном потоке, то у тебя должно быть
IsMultiThread:=TRUE;
MegaVolt (2006-12-28 18:09:00) [23]>Соотвественно ищи ошибку в другом месте.
Как? Что ловить какие характерные куски анализировать?
Anatoly Podgoretsky (2006-12-28 17:57:00) [24]> MegaVolt (28.12.2006 17:52:06) [6]
> 3. Добавление моего когда для записи логов способствуует появлению ошибок
Соотвественно ищи ошибку в другом месте.
MegaVolt (2006-12-28 17:52:00) [25]>Я не слишком рискую, если предположу, что не может.
Я встречал глюк при частом выделении памяти маленькими кусками например в TMemoryStream почему не исключить такие же проблемы с выделением памяти под строки? Тем более если верить отладчику именно при этом и вознимкают ошибки (если судить по истории вызовов процедур)
Как ловить проблему если:
1. Место появления ошибки нестабильно
2. Строка с ошибкой находится в генофонде а не в моём коде
3. Добавление моего когда для записи логов способствуует появлению ошибок
4. Баг не повторяем. Т.е. действия приведшие к глюку при одном запуске не приводят к глюку во втором.
Джо (2006-12-28 17:44:00) [26]> [4] MegaVolt © (28.12.06 17:37)
> К сожалению не могу точно описать потому что симптомов море.
Ну, и чем ты думаешь тебе смогут помочь в таком случае? Ясно одно — программа неверно написана :)
> Может ли быть проблема с тем что данная функция вызывается
> очень часто (в каждой моей процедуре или функции) и возникают
> какие то проблемы при частом выделении памяти под стрококу.
Я не слишком рискую, если предположу, что не может.
MegaVolt (2006-12-28 17:37:00) [27]К сожалению не могу точно описать потому что симптомов море. Прога падает с исключением. Иногда ругается на проблемы работы с памятью а именно в модуле getmem.inc. Иногда ругается на невозможность создания битмапа. Если же Enabled выставить в false все глюки пропадают. Может ли быть проблема с тем что данная функция вызывается очень часто (в каждой моей процедуре или функции) и возникают какие то проблемы при частом выделении памяти под стрококу.
Джо (2006-12-28 17:29:00) [28]> Как лечить?
Что лечить-то? Приведенный код вполне работоспособен. А «проблемы с выделением памяти и нестабильной работе программы» — не озвучены.
MegaVolt (2006-12-28 16:53:00) [29]>Причем здесь какие-то задержки?
Это была версия. В проге используется мультимедийный таймер возможно добавление задержек вызывает какие то эффекты. Если задержки не при чём тогда в чём дело? Как лечить?
Джо-со-смарта (2006-12-28 16:43:00) [30]Причем здесь какие-то задержки?