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

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

Работа со строками приводит к ошибкам при выделении памяти [D5, D7, Win95/98]


Страницы:   1 2

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]

Причем здесь какие-то задержки?


Страницы:   1 2

Наверх

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