Хотел сделать его не зависящим от основного потока программы, а так же других потоков, которые порождаются в процессе выполнения.
Для этого в отдельном юните, сделал класс наследник от 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 или критические секции - не совсем то что надо, ибо оно будет тормозить основной поток, от чего собственно и пытаюсь уйти при помощи этого логера