Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 07:04
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat