Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];

Вниз

ЛОГ   Найти похожие ветки 

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

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

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

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


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

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

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

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



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

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

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.


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

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


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

Anatoly Podgoretsky © (29.10.02 11:20):

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

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


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

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


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

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


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

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

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


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

Да почему не подходит-то?
На 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:19) [9]

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

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

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


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

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


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

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


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

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


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

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


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

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


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

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");


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

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
);
....

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


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

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

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


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

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


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

Anatoly Podgoretsky © (29.10.02 19:34)

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
1-21617
Shark_raph
2002-10-26 07:58
2002.11.07
Как написать эмулятор нажатия Ctrl+Alt+Del в Win2k


14-21813
Beginner-Designer
2002-10-20 16:52
2002.11.07
Сайты по С++ Builder


1-21472
Alex
2002-10-25 00:45
2002.11.07
TStringGrid


1-21661
^Sanya
2002-10-27 21:22
2002.11.07
MDI: как узнать, создан ли ребёнок, или нет - без цикла перебора?


4-21860
3d
2002-09-24 22:10
2002.11.07
Форма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский