TSimpleThread

[add] Seit Delphi XE hat mir Emba diese Idee geklaut und bietet ein TThread.CreateAnonymousThread(procedure … end).Start; an.
Und mit XE7 wurden nun endlich die delphieigenen Threadfunktionen erweitert, z.B. um einen Threadpool.
[/add]

 

Einige kennen es ja,
wie erstellt man einen Thread und übergibt ein paar Parameter?

Seit einiger Zeit (Delphi 2009) kann man nun mit anonymen Methoden schöne Spielereien anfangen.
So könnte man sich z.B. eine universelle Klasse erstellen, welcher man jeden beliebigen Code und eine unbekannte Anzahl an Parametern mitgeben kann.
[delphi] var
TheParam, TheParam2: String;
begin
TheParam := ‚der Text‘;
TheParam2 := ‚Caption‘;
TSimpleThread.RunAsThread(procedure
begin
// von hier …
MessageBox(0, PChar(TheParam), PChar(TheParam2), 0);
// bis hier wird alles im Thread ausgeführt ^^
end);
[/delphi]

Nötig dafür ist eigentlich nur diese Klasse, welche man nie wieder ableiten muß und immer direkt so verwenden kann.
[delphi] type
TSimpleThread = class(TThread)
private
FProc: TThreadProcedure;
protected
procedure Execute; override;
public
class procedure RunAsThread(Proc: TThreadProcedure);
end;

procedure TSimpleThread.Execute;
begin
FProc;
end;

class procedure TSimpleThread.RunAsThread(Proc: TThreadProcedure);
var
Thread: TSimpleThread;
begin
Thread := TSimpleThread.Create(True);
Thread.FProc := Proc;
Thread.FreeOnTerminate := True;
Thread.Start;
end;
[/delphi]

Das TSimpleThread.RunAsThread könnte man natürlich auch als einfache Prozedur erstellen, aber ich hab gern alles zusammen.

 

PS: genauso kann man übrigens von überall, und nicht nur aus einer eigenen Threadklasse Synchronize aufrufen kann.
Dieses funktioniert auch aus API-Threads und es muß nicht immer ein TThread-Nachfahre sein.
[delphi] TThread.Synchronize(procedure
begin
// von hier …
ShowMessage(‚Hallo‘);
// bis hier wird alles wieder im Hauptthread ausgeführt
end);
[/delphi] Was man natürlich in der oberen Thread-Methode ebenfalls so nutzen kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert