Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 23:34   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Смущение Ведение лога. Тупик. Одновременное обрашение двух обьектов к одному файлу.

Всем доброго времени суток!

Ситуация:
Программа ведёт 3 лога, лог программы,лог самообновления и лог того что делают ветви(TtHread's) моей программы.

Собственно:
Код:

const
  DateFormat = 'dd.mm.yy';
  TimeFormat = 'hh:mm:ss';
  DateTime = ' ';
  DateTimeText = ' | ';
  DateStart = '[';
  TimeEnd = ']';
  FileName_DateFormat = 'DD_MM_YY';
  FileName_TimeFormat = 'HH-MM';

procedure SystemLog(msg: string);

implementation

uses GlobalConsts;

procedure SystemLog(msg: string);
var
  LogFileName: string;
  Ts: TStringList;
begin
  ts := TStringList.Create;
  LogFileName := myDir + 'Data\Logs\System\' + '(' + FormatDateTime(FileName_DateFormat, Date) + ').log';
  try
    if FileExists(LogFileName) then
{$I-}
      Ts.LoadFromFile(LogFileName);
{$I+}
    Ts.Add(DateStart + FormatDateTime(TimeFormat, Time) + TimeEnd + DateTimeText + msg);
    Ts.SaveToFile(LogFileName);
  finally
    Ts.Free;
  end;
end;
Аналогично ещё две точно такиеже,только директории и имена файлов разные.

Вот юзер прислал отчёт об ошибке:
Выдержка из него:
Код:
exception class   : EFOpenError
exception message : Cannot open file "D:\Установленное\Программы\HLR\Data\Logs\Applications\( 17_12_10).log". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

main thread ($1f24):
0046d8f0 +114 HLR.exe      Classes              5120 +11 TFileStream.Create //и обращение второго
0046d7b6 +02a HLR.exe      Classes              5102  +2 TFileStream.Create //Обращение первого
0046bf3c +018 HLR.exe      Classes              4265  +1 TStrings.LoadFromFile //Вызов файла
005df38c +094 HLR.exe      LogUnit                54  +6 SystemLog   //Вызов процедуры
005e6bdc +0d4 HLR.exe      ErrorWindowListUnit    90  +8 TErrorWindowList.OnTimer
0048a8bb +01b HLR.exe      ExtCtrls             1649  +1 TTimer.Timer
0048a727 +02f HLR.exe      ExtCtrls             1607  +4 TTimer.WndProc
004762cc +014 HLR.exe      Classes             10966  +8 StdWndProc
76c63573 +00a USER32.dll                                 DispatchMessageA
004d82c8 +0ac HLR.exe      Forms                6872 +13 TApplication.ProcessMessage
004d830f +00f HLR.exe      Forms                6891  +1 TApplication.HandleMessage
004d85aa +0a6 HLR.exe      Forms                6975 +16 TApplication.Run
005ec231 +299 HLR.exe      HLR                   126 +50 initialization
75601192 +010 kernel32.dll                               BaseThreadInitThunk

Как видно одновременно к одному файлу обращаются 2 обьекта. И каждый пытается сделать загрузить файл, сделать запись, сохранить.

Я в тупике....

Толи я логи вести ни как не научусь, толи сани не едут, толи я ....

Посоветуйте пожалуйста как правельно вести лог, и избавиться вот от такого.

Ранее к имени файла приписывавал секунды, но это глупо! Многова-то файлов а хлам никчему. Да и мне его разгребать тоже не айс.
Человек_Борща вне форума Ответить с цитированием
Старый 18.12.2010, 10:49   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

сделать один объект доступа к логу. (к примеру тот же TstringList)
ведение лога через операции данного объекта.
при наличии одного объекта зачем каждый раз перечитывать TstringList.LoadFrormFile
достаточно просто каждый раз savetofile

P.S. один имеется в виду для каждого из файлов.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.12.2010, 11:00   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

http://articles.org.ru/delphi7/Glava29/index15.php
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 18.12.2010, 18:29   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хм критические секции? Я думал они только для потоков...
Человек_Борща вне форума Ответить с цитированием
Старый 19.12.2010, 11:52   #5
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Рекомендую, для логов и прочего, все уже придумано: http://www.eurekalog.com/index_delphi.php
XerSon вне форума Ответить с цитированием
Старый 19.12.2010, 21:33   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Проблема решена. Для каждого файла свой TsringList создаётся 1 раз, пишет на всем протяжении работы программы, сохраняет файл при разрушении формы. Там же уничтожается.

P.S.
Вместо эврики использую madexcept , для меня его достаточно.
И логи можно вести не только для ошибок.
Человек_Борща вне форума Ответить с цитированием
Старый 20.12.2010, 10:13   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
сохраняет файл при разрушении формы.
А если программа повиснет (например бесконечный цикл), то лога мы не увидим.
Или жесткое завершение программы (немедленное завершение процесса без закрытия разрушения объектов).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.12.2010 в 10:16.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# доступ к txt-файлу из двух процессов одновременно lexluter1988 Помощь студентам 2 30.05.2010 15:24
Подключение двух мониторов, клавиатур и мышек к одному системнику firmwares Общие вопросы Delphi 3 15.04.2010 00:07
Как добавить ведение лога в свою программу? Человек_Борща Общие вопросы Delphi 12 20.02.2010 14:30
Как запрограмировать столкновение двух обьектов (например image1 и image2)? virus88 Общие вопросы Delphi 8 28.05.2009 18:09
Движение ДВУХ ОБЬЕКТОВ Wi1D Помощь студентам 4 15.05.2009 08:57