Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизкак лучше огранизовать лог программы Найти похожие ветки
← →
tippa (2010-03-19 09:34) [0]Вообщем написал програмку, и вот хочу потестировать пару суток. Думаю сделать ведение лога, где-то 1строка в секунду. Как это лучше сделать? Постоянно хранить весь лог в строке и каждую секунду сбрасывать его на диск или дописывать строки через FileWrite?
← →
И. Павел © (2010-03-19 09:38) [1]Вот, к примеру, можно так: http://www.excode.ru/art5124p6.html
PS: Хотя с таким периодом (1 строка в секунду), наверное, можно как угодно - все равно серьезной потери производительности/памяти не будет.
← →
Дмитрий Белькевич (2010-03-19 11:57) [2]Одна строка в секунду - это на современном железе ничто. Делай простую запись в файл.
← →
KSergey © (2010-03-19 11:57) [3]> И. Павел © (19.03.10 09:38) [1]
Странно, зачем автор этого кода пользуется TFileStream? Упражнялся?
Ведь обычный WriteLn ничуть не хуже по функциональности, а писанины - на порядок меньше.
С лог-файлами беды две:
а) накладные расходы, т.е. роизводительность
б) писать их без кеширования, т.к. иначе при падении программы мы можем потерять последние записи в файте, а это самое интересное.
Пункт б) решается либо каждый раз открывая/закрывая файл при записи очередной строки (как в приведенном коде), но это сильно усугубляет пункт а), либо открытием файла со спец. флажками.
Типа так, напримерLogFile:Integer;
LogFile := CreateFile("file.log", GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
...................
procedure WriteDebugInfo(const s:String);
const
LOG_LINE_END = #13#10;
LOG_DATETIME_FORMAT = "dd.mm.yyyy hh:nn:ss.zzz; ";
LOG_BUF_STR_GROW_SIZE = 1024;
log_buf_str: String = "";
var
datetime_str: String;
real_len, requerd_len, new_len: Integer;
fwritten:DWORD;
begin
try
DateTimeToString(datetime_str, LOG_DATETIME_FORMAT, now());
real_len := Length(datetime_str) + Length(s) + Length(LOG_LINE_END);
requerd_len := real_len + 2; // #0
if Length(log_buf_str) < requerd_len then
begin
new_len := ((requerd_len div LOG_BUF_STR_GROW_SIZE)+1) * LOG_BUF_STR_GROW_SIZE;
SetLength(log_buf_str, new_len);
end;
StrPCopy(PChar(log_buf_str), datetime_str);
StrPCopy(PChar(log_buf_str)+Length(datetime_str), s);
StrPCopy(PChar(log_buf_str)+Length(datetime_str)+Length(s), LOG_LINE_END);
SetFilePointer(LogFile,0,nil,FILE_END);
WriteFile(LogFile, log_buf_str[1], real_len, fwritten , nil);
except
end;
end;
← →
Юрий Зотов © (2010-03-19 16:11) [4]> KSergey © (19.03.10 11:57) [3]
> Пункт б) решается либо каждый раз открывая/закрывая файл
> при записи очередной строки (как в приведенном коде), но
> это сильно усугубляет пункт а), либо открытием файла со
> спец. флажками.
Либо простым вызовом Flush. И тогда получим то самое:
> Ведь обычный WriteLn ничуть не хуже по функциональности,
> а писанины - на порядок меньше.
:o)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.067 c