Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

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

Re: Multi Threaded Application

  Alt 16. Mär 2007, 11:28
Du musst Dir angewöhnen, jedes instantiierte Objekt im korrespondierenden Kontext wieder freizugeben:
Hier ein paar Beispiele;

Delphi-Quellcode:
Procedure LokaleInstantiierung;
Var
  MyObject : TMyObject;

Begin
  MyObject := TMyObject.Create;
  Try
// ... tu was mit MyObject
  Finally
    MyObject.Free;
  End;
End;
Delphi-Quellcode:
Unit GlobaleInstantiierung;
Interface...

implementation
Var
  MyObject : TMyObject;
...
Initialization
  MyObject := TMyObject.Create;
Finalization
  MyObject.Free;
End;
Delphi-Quellcode:
Type
  TClassField = Class (TBigObject)
    FMyObject : TMyObject;
  Public
    Constructor Create;
    Destructor Destroy;
  End;
...
Constructor TClassField .Create;
Begin
  ...
  FMyObject := TMyObject.Create;
End;

Destructor TClassField.Destroy;
Begin
  FMyObject.Free;
  Inherited
End;

Delphi-Quellcode:
Type
  TFormInstantiierung = Class (TForm)
...

    Procedure FormCreate (Sender : TObject);
    Procedure FormDestroy (Sender : TObject);
...
  Private
    FMyObject : TMyObject;
  End;

Procedure TFormInstantiierung.FormCreate (Sender : TObject);
Begin
  ...
  FMyObject := TMyObject.Create;
End;

Procedure TFormInstantiierung.FormDestroy (Sender : TObject);
Begin
  ...
  FMyObject.Free;
End;
Und vielleicht noch 'FreeAndNil' statt '.Free', das vermeidet böse Fehler.

Dann noch:

Einen Thread einfach so zu killen (mit Free / Destroy) ist natürlich tödlich. Richtig macht man es so:
Delphi-Quellcode:
With MyThread Do Begin
  Terminate; // Hör auf!
  WaitFor; // Warte bis er aufgehört hat!
  Free; // Jetzt erst resourcen freigeben (u.a. das Threadhandle ;-)
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat