Wenn Sie eine spezielle Initialisierung und Finalisierung mit Ereignissen wie in Davids Antwort durchführen möchten, müssen Sie diese Ereignisse für jeden von Ihnen erstellten Thread zuweisen. Und das bedeutet, dass entweder ein bestimmter Konstruktor hinzugefügt wird, um sie zu übergeben oder die Threads im gesperrten Modus zu erstellen.
Persönlich kann ich nicht wirklich, wie all diese Dinge, die daran erinnern, zu tun und deshalb für eine polymorphe Lösung gehen würde:
type
TInitializeFinalizeThread = class(TThread)
protected
procedure InitializeExecution; virtual;
procedure FinalizeExecution; virtual;
procedure InternalExecute; virtual;
procedure Execute; override;
end;
procedure TInitializeFinalizeThread.Execute;
begin
InitializeExecution;
try
InternalExecute;
finally
FinalizeExecution;
end;
end;
Themen benötigen Ole Stuff zu tun, dann eine gemeinsame Basis haben könnte das braucht Pflege der Initialisierung und finialization:
type
TOleThread = class(TInitializeFinalizeThread)
protected
procedure InitializeExecution; override;
procedure FinalizeExecution; override;
end;
procedure TOleThread.InitializeExecution;
begin
CoInitialize;
end;
procedure TOleThread.FinalizeExecution;
begin
CoUninitialize;
end;
das bedeutet, dass Klassen, die tatsächlich etwas tun wird sind gerade von TOleThread
erben können und dass die Initialisierung und Finalisierung getroffen wurden betreut, so dass sie sicher sein, nur müssen InternalExecute
überschreiben.
type
TWordMailMergeThread = class(TInitializeFinalizeThread)
protected
procedure InternalExecute; override;
end;
procedure TWordMailMergeThread.InternalExecute;
begin
// Whatever you need this to do.
end;
Obwohl sie natürlich frei, die InitializeExecution
und FinalizeExecution
Methoden außer Kraft zu setzen einzurichten und beenden Sie die Verbindung zum OLEServer (Word in diesem Beispiel), anstatt es in den InternalExecute
tun.
Mit anderen Worten, ja. Peter, was sind deine Bedenken, dies zu tun? –