Der unkontrollierte Zugriff auf die Memo-Komponente ist der Grund für deine sporadischen 'Hänger'.
Ich würde Dir empfehlen, eine Logging-Klasse zu schreiben. Hier ein Vorschlag:
Delphi-Quellcode:
uses
SyncObjs;
Type
TLogger = Class (TThread)
private
fMsg : String;
fCS : TCriticalSection;
fLogStrings : TStringlist;
fMemo : TMemo;
Procedure DoAddToLog;
protected
Procedure Execute; Override;
public
Constructor Create (aMemo : TMemo);
Procedure Log (Const aMessage : String);
destructor Destroy; override;
End;
Constructor TLogger.Create (aMemo : TMemo);
Begin
Inherited Create(True);
fCS := TCriticalSection.Create;
fLogStrings := TStringList.Create;
fMemo := aMemo;
End;
Procedure TLogger.Log (Const aMessage : String);
Begin
fCS.Enter;
Try
fLogStrings.Add(DateTimeToStr(Now)+': '+aMessage);
If Suspended Then Resume;
Finally
fCS.Leave;
End;
End;
Procedure TLogger.Execute;
Function _ExtractString : Boolean;
Begin
fCS.Enter;
Try
If fLogStrings.Count > 0 Then Begin
fMsg := fLogStrings[0];
fLogStrings.Delete (0);
Result := True;
End
Else
Result := False;
Finally
fCS.Leave;
End
End;
Begin
While not Terminated Do Begin
If _ExtractString Then
Synchronize(DoAddToLog)
Else
Suspend;
End
End;
Procedure TLogger.DoAddToLog;
Begin
fMemo.Lines.Add(fMsg);
End;
Destructor TLogger.Destroy;
Begin
fCS.Free;
fLogStrings.Free;
End;