Хотел сделать его не зависящим от основного потока программы, а так же других потоков, которые порождаются в процессе выполнения.
Для этого в отдельном юните, сделал класс наследник от TTHread который должен получать строку с информацией для записи в лог-файл.
- Код: Выделить всё
- TLogFile = class(TThread)
 private
 fMessage:String;
 fLogName:String;
 fLogDirectory:String;
 fMessages:TStringList;
 fFileLogName:String;
 fLogDate:TDateTime;
 protected
 function LogFileName:String;
 function SaveToLog:String;
 procedure Execute; override;
 procedure TerminateProcess(Sender: TObject);
 public
 constructor create(AlogDirectory:String=''; ALogName:String='');
 procedure Add(const AMessage:String);
 property LogDirectory:String read fLogDirectory;
 property Messages:TStringlist read fMessages;
 end;
 .......
 constructor TLogFile.create(AlogDirectory: String; ALogName: String);
 begin
 inherited Create(true);
 OnTerminate:=@TerminateProcess;
 fMessages:=TStringList.Create;
 fLogName:=ALogName;
 fLogDirectory:=ALogDirectory;
 fFileLogName:='';
 FreeOnTerminate := True;
 fLogDate:=Date;
 start;
 end;
 procedure TLogFile.Add(const AMessage: String);
 begin
 fMessages.Add(AMessage);
 end;
 procedure TLogFile.Execute;
 Begin
 While (not Terminated) or (fMessages.Count>0) do
 Begin
 if fMessages.Count>0 then
 Begin
 fMessage:=fMessages.Strings[0];
 fMessage:=SaveToLog;
 if fMessage<>'' then fMessages.Append(fMessage)
 else
 fMessages.Delete(0);
 end
 else sleep(1000);
 end;
 end;
 function TLogFile.SaveToLog: String;
 begin
 ... тут просто запись в конец файла строки fMessage
 ... если ошибка вернет не записанную строку, если все ОК, то вернет пустую строку
 end;
 
При инициализации юнита создаю глобальную переменную с экземпляром этого класса
и при финализации - освобождаю.
Здесь, я использовал fMessages:TStringList как своего рода очередь записей в лог.
Т.е. из любого места программы, использую вызов
MainLog.Add('супер сообщение в лог');
сообщение добавляется в "очередь" и поток обрабатывает её, при появлении там чего-либо, пишет в файл.
Но при работе с таким вот логом из дополнительных потоков, естестсвенно возникает проблема, т.к. это не потокобезопасное добавление нового сообщения в очередь на запись в лог.
Гуглил передачу данных в поток, но не смог найти решения.
Подскажите, как сделать эту очередь записей в лог - потокобезопасной.
syncronize или критические секции - не совсем то что надо, ибо оно будет тормозить основной поток, от чего собственно и пытаюсь уйти при помощи этого логера





 ( оказывается Queue(nil,procedure.. ) тоже может  работать из основного потока )
 ( оказывается Queue(nil,procedure.. ) тоже может  работать из основного потока )   
  
   То есть двух состояний мало, нужно поключаться к записи в два этапа, а потом сообщить управленцу об окончании записи, а уже потом писать  fLog.IsBusy:=false;
 То есть двух состояний мало, нужно поключаться к записи в два этапа, а потом сообщить управленцу об окончании записи, а уже потом писать  fLog.IsBusy:=false;