Добавил логгер на GUI
Механизм такой – при добавлении сообщения в лог, автоматически обновляется GUI. Сообщения идут в обратном порядке. Ключевым моментом является функция WaitAndCreateLogFileStream класса TLDSLogger. Сначала сообщения пишутся в файл, затем из файла в GUI. Всей многопоточной логикой заведует класс TLDSLogger.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
unit uCommon; interface uses LDSLogger, uConst, System.SysUtils, System.Classes, IdCustomHTTPServer, superobject, uResponses; type int = integer; ILogger = interface(IUnknown) ['{CE79C197-CB93-4576-9590-6FA2ED197652}'] procedure LogError(aMsg: string); procedure LogInfo(aMsg: string); end; TLogger = class(TInterfacedObject, ILogger) procedure LogError(aMsg: string); procedure LogInfo(aMsg: string); procedure UpdateMainLogMemo(); end; implementation uses uMain, uSmartPointer; { TLDSLoggerImpl } procedure TLogger.LogError(aMsg: string); var l: TLDSLogger; begin l := TLDSLogger.Create(logFileName); try l.LogStr(aMsg, tlpError); UpdateMainLogMemo; finally l.Free; end; end; procedure TLogger.LogInfo(aMsg: string); var l: TLDSLogger; begin l := TLDSLogger.Create(logFileName); try l.LogStr(aMsg, tlpInformation); UpdateMainLogMemo; finally l.free; end; end; procedure TLogger.UpdateMainLogMemo; var fs: TFileStream; ss: ISmartPointer<TstringStream>; sl: ISmartPointer<TStringList>; i: Integer; begin fs := nil; fs := WaitAndCreateLogFileStream(logFileName, fmOpenRead, -1); ss := TSmartPointer<TstringStream>.Create(); sl := TSmartPointer<TStringList>.Create(); try ss.LoadFromStream(fs); Main.mLog.Lines.Text := ss.DataString; sl.Assign(Main.mLog.Lines); Main.mLog.Lines.Clear; for i := sl.Count - 1 downto 0 do Main.mLog.Lines.Add(sl[i]); finally fs.Free; end; end; end. |