Re: Multi Threaded Application
Das geht aber nicht in der Finalization....dort erkennt er nämlich die Klasse MyThread.Free nicht.
|
Re: Multi Threaded Application
Wo hast du die Threads deklariert?
Global oder lokal? Wenn sie global sind, sollten sie auch im Finalization-Teil verfügbar sein. |
Re: Multi Threaded Application
Wenn du mal im Borlandverzeichnis unter Demos in Threads schaust, dann sind meine Threads genauso deklariert wie bei borland, sprich:
Delphi-Quellcode:
Unter Execute wird dann der jeweilige Thread aufgerufen und ausgeführt.
type
TMyThread = class(TThread) private { Private-Deklarationen } TFunc : Byte; TData : PChar; TNames : PChar; TValues : PChar; TIndex : Byte; protected procedure Execute; override; function Myfunction: Integer; virtual; abstract; public constructor Create(Func: Byte; Data, Names, Values: PChar; DriveIdx: Byte); end; TFirstThread = class(TMyThread) protected function Myfunction: Integer; override; end; TSecondThread = class(TMyThread) protected function Myfunction: Integer; override; end; |
Re: Multi Threaded Application
Hallo......weiß keiner eine Antwort???? :(
|
Re: Multi Threaded Application
Zitat:
Also, dein Programm darf erst dann beendet werden, wenn alle deine Thread beendet sind. Wird das nicht beachtet, dann knallt's !! Wenn du deine Thread-Objekte nicht in einer Jobliste sammelst, dann hast du später keinen Zugriff auf deine Threadobjekte mehr und weisst nicht, ob dein Programm beendet werden darf. So ein Thread kann ja auch recht lange laufen. Deshalb muss der Thread immer wieder das Property Terminated abfragen, ob er eigentlich noch weiterlaufen darf:
Delphi-Quellcode:
Hast du das beachtet ??
procedure TMyThread.Execute;
var i : integer; begin for :=1 to 1000000 do begin DoWork; if Terminated then // <==== begin ReturnValue := 9999; // signalisieren, dass wir unterbrochen wurden break; end; end; ReturnValue := 0; // Thread beendet, Aufgabe zu 100% erfüllt end; |
Re: Multi Threaded Application
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:
Und vielleicht noch 'FreeAndNil' statt '.Free', das vermeidet böse Fehler.
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; 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz