TCriticalSection Threrad Example Delphi
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 |
TThreadedMsgEvent = class( TThread ) private FLock : TCriticalSection; FStr : TQueue<String>; FMemo : TMemo; function GetEvent : String; protected procedure Execute; override; public procedure AddEvent( aMsg : String ); constructor Create( AMemo: TMemo ); destructor Destroy; override; end; implementation { TThreadedMsgEvent } procedure TThreadedMsgEvent.AddEvent(aMsg: String); begin FLock.Acquire; FStr.Enqueue( FormatDateTime('DD/MM/YY HH:NN:SS.ZZZ',Now)+ ' : '+ aMsg ); FLock.Release; end; constructor TThreadedMsgEvent.Create(aMemo: TMemo); begin inherited Create(True); FreeOnTerminate := False; FOnMessage := ACallBack; FStr := TQueue<String>.Create(); FLock := TCriticalSection.Create; FMemo := aMemo; Resume; end; destructor TThreadedMsgEvent.Destroy; override; begin FreeAndNil( FStr ); FreeAndNil( FLock ); end; procedure TThreadedMsgEvent.Execute; begin while not Terminated do begin try if (FStr.Count > 0) then begin if Assigned( aMemo ) then begin TThread.synchronize( procedure begin FMemo.Lines.Add( GetEvent ); end; ); end; end; except end; TThread.Sleep(1); end; end; function TThreadedMsgEvent.GetEvent: String; begin FLock.Acquire; result := FStr.Dequeue; FLock.Release; end; |
From post found at: https://stackoverflow.com/questions/17506615/how-to-handle-log-in-a-threaded-manner-in-delphi