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

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

ЛОГ [D6, Win2k]


Ерик ©   (2002-10-29 11:00:00) 

Пишу лог програмы в TextFile. В OnCreate формы открываю файл и в OnDestroy закрываю. Проблема в том что когда создаю файл, пишу в него и пытаюсь его скопировать в другом месте (програма еще не закрыта то есть CloseFile не сделали). Наверно есть буфер который не понимаю когда сбрасывается.

Как сделать чтобы после каждого Writeln этот буфер сбросился в файл. Если скопировать файл чтобы была вся информация.

Спасибо заранее.


kig   (2002-10-29 22:15:00) [1]

Anatoly Podgoretsky © (29.10.02 19:34)

Ну и работать через CreateHandle - в смысле через Д-обертки, а не
через TextFile


Леха_   (2002-10-29 20:00:00) [2]

как вариант временно сохраняй лог в стринг лист и каждую скажем сотню строк сбрасывай накопившееся в файл и очищай стринг лист


Anatoly Podgoretsky   (2002-10-29 19:34:00) [3]

Ерик (29.10.02 15:44)
Ты как раз на это и наткнулся, не видишь записи, а вот при закрытии файла она бы там оказалась и читатель смог бы ее получить. Еще раз настоятельно советую проведи натурные испытания и только после этого принимай решение, может тебе вообще надо будет уйти в сторону Memory Mappes Files, это зависит от задачи, но я думаю, что предложенного варианта будет достаточно. Да читатели должны учитывать что файл может быть не доступен из за блокировки на время записи.

kig © (29.10.02 19:14)
Это не катит, это сбрасывает системные буферы, а здесь не сброшен буфер Паскаля. Это естественно тоже важно, но это немного к другому относится.


kig   (2002-10-29 19:14:00) [4]

FlushFileBuffers
The FlushFileBuffers function flushes the buffers of the specified file and causes all buffered data to be written to the file.

BOOL FlushFileBuffers(
HANDLE hFile // handle to file
);
....

А это не катит????


Reindeer Moss Eater   (2002-10-29 16:55:00) [5]

var LogName:string;

procedure Log(const AMsg : string; const AParam : string = "");
var F:Text;
begin
Assign(F,LogName);
try
if FileExists(LogName) then Append(F) else Rewrite(F);
Writeln(F,FormatDateTime("dd.mm.yyyy hh:mm:ss",Now),#9,AMsg,#9,AParam);
finally
Close(F);
end;
end;

initialization
LogName:=ChangeFileExt(ParamStr(0),".log");


Cobalt   (2002-10-29 16:52:00) [6]

> Ерик
Дело в том, что текстовые файлы(простые) - при чтении требуют обязательного буферизирования, т.к. нельзя заранее определить размер строки(а только по факту обнаружения оного в буфере).
Другое дело, что при записи, конечно, не требуется этого, но вот при чтении...
Попробуйте использовать собственноручнонаписанную ф-ию записи строки в файл, и открывайте файл(CreateFile) на запись с флагом WriteThrough(т.е. писать без буфера).


Ерик   (2002-10-29 15:44:00) [7]

Anatoly Podgoretsky © (29.10.02 15:37)
Хорошо, я так и сделаю...
Но если вас не затруднит обьясните плиз что имеете в виду под термином "нормальную работу в многопрограммную среду" а то я не совсем понял. Этот файл нигде больше не используется, только когда быают разборки. И делается он на каждый день. То есть в каждый день другой файл.


Anatoly Podgoretsky   (2002-10-29 15:37:00) [8]

Все таки стоит открывать и закрывать после записи кажой строчки, только так сможешь обеспечить нормальную работу в многопрограммной среде.
А что касается скорости, то почему бы не гадать а проверить в цикле скажем на 10000 записей Append;writeln; closefile и замерить время.


Ерик   (2002-10-29 15:29:00) [9]

Song © (29.10.02 15:22)
Я вижу до вас еще не дошло...
>>Вы хотите записывать в файл, а время операцию записи тритить >>не хотите..
Я хочу писать в файл! И тратить время тоже :)
Просто я хотел обсуждать то что напсал Anatoly Anatoly Podgoretsky © (29.10.02 11:20).


Song   (2002-10-29 15:22:00) [10]

Хорошо, делайте SaveToFile() после каждого добавления.. по-другому Вашу проблему не решить.. Вам и булочку съесть и на .... Понимаете? Вы хотите записывать в файл, а время операцию записи тритить не хотите..


Ерик   (2002-10-29 15:19:00) [11]

Song © (29.10.02 15:09):
И чем_не_подходит_мой_способ?
А вы сами подумайте над вашими словами:
Создоется TStringList, в нем добовляются строки а когда програма закрывается то его содержимое пишется в файл...

Имейти в виду что програма должна работать без перезагрузки сколько возможно - и полгода и год и т.д.(если конешно ничего не сглючит)

И как вы думаете долго будет работать это програма если логи будут писатся интесивно?
Повторюсь что: можно лог писать в память и потом, по мере заполнения (например 1.44 Mb)сбросить чтобы работало быстрее - но это пока не требуется.


Song   (2002-10-29 15:09:00) [12]

Да почему не подходит-то?
На TForm.onCreate
Var StrList:TStringList;
StrList:=TStringList.Create;
StrList.LoadFromFile("log.txt");

Когда нужно что-то добавить в log пишите StrList.Add("что-то");

На TForm.Close пишите
StrList.SaveToFile("log.txt");
StrList.Free;

И чем_не_подходит_мой_способ?


Ерик   (2002-10-29 15:02:00) [13]

Song © (29.10.02 14:47):
Вы наверно не поняли вопрос, а он состоит в том что открывается текстовой файл и в нем иногда интесивно пишутся логи(разные потоки) а иногда не очень.
Anatoly Podgoretsky сказал что нужно открыть файл записать и закрыть, Занимать файл только на минимальное время - Anatoly Podgoretsky © (29.10.02 11:20). Но если этих закрытий-окрытий будет очень много я подозреваю что резко снизится производительность, так что лучше оставить файл открым и по мере надобность делать запись.

А TStringList для этих целей совсем не подходит. Другое дело что можно лог писать в памать и потом, по мере заполнения (например 1.44 Mb)сбросить чтобы работало быстрее - но это пока не требуется.


Song   (2002-10-29 14:47:00) [14]

Добавляйте в TStringList к примеру. На onClose допишите содержимое в файл.


Ерик   (2002-10-29 14:40:00) [15]

Anatoly ответьте плиз.


Ерик   (2002-10-29 11:46:00) [16]

Anatoly Podgoretsky © (29.10.02 11:20):

Скажем так:
если в програме поставить большой уровень логироавния то эти логи пишут интесивно из несколько потоков одновременно(естествено они синкронизируются через критические секции). Если для каждой строки сделать Reset, CloseFile то это займет намного больше ресурсов чем просто Writeln так как операции вода-вывода всегда связанны с затратой ресурсов.

Или я неправильно расуждаю???


Anatoly Podgoretsky   (2002-10-29 11:20:00) [17]

Чтение/Запись в текстовые файлы буферизованное, сбросить брядли сможешь, да и по правилам мультипрограммной среды это надо делать через закрытие открытие ресурса, так что Close и повторное открытие когда нужно. Занимать файл только на минимальное время.


Ерик   (2002-10-29 11:12:00) [18]

Кажется уже нашел:

procedure Flush(var t: Text);

Description

F is a text file variable.

When a text file is opened for output using Rewrite or Append, Flush empties the file"s buffer. This guarantees that all characters written to the file at that time have actually been written to the external file. Flush has no effect on files opened for input.

Note: {$I+} handles run-time errors using exceptions. When using {$I-}, use IOResult to check for I/O errors.


Ерик   (2002-10-29 11:01:00) [19]

Sorry:
Пишу лог програмы в TextFile. В OnCreate формы открываю файл и в OnDestroy закрываю. Проблема в том что когда создаю файл, пишу в него и пытаюсь его скопировать в другом месте (програма еще не закрыта то есть CloseFile не сделали) то последней строки не видно . Наверно есть буфер который не понимаю когда сбрасывается.

Как сделать чтобы после каждого Writeln этот буфер сбросился в файл. Если скопировать файл чтобы была вся информация.

Спасибо заранее.


Наверх

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