Ich habe im Moment eine threoretische Fragen, bei der ich nicht ganz verstehe, warum es denn nicht klappt. Und zwar kann ich via
BeginThread()
ja den Code einer Procedure als Thread ausführen -- das ganze klappt auch wunderbar mit einer Klassenmethode. Nun wollte ich auf
Self als Parameter übergeben, was ich auch via [delphi]Pointer(Self)[/delphi) getan habe.
Wenn ich nun eine Klassenmethode via BeginThread ausführe, so bekomme ich es nicht gebacken, Self über den Parameter zu erhalten. Habe ich statt dessen eine (globale) Procedure als Thread-Code, so funktioniert die Übergabe von
Self ohne Probleme. Nur warum ist das so? Ich habe in einem Post vorher gelesen, dass das nur so klappt, nur stand da leider keinerlei Begründung.
Hier nochmal etwas Code:
Delphi-Quellcode:
type
TTest =
class(TObject)
private
FThreadHandle : Integer;
FThreadID : Cardinal;
public
procedure StartIt();
procedure ThreadedMethod(Instance: TTest);
end;
procedure ThreadedProcedure(Instance: TTest);
implementation
// --- here the global procedure ---
procedure ThreadedProcedure(Instance: TTest);
begin
//
// < ------- Instance = Self parameter
//
end;
// --- here the class methods ---
procedure TTest.StartIt();
begin
// i know, i overwrite the handle and id ;)
FThreadHandle := BeginThread(
nil, 0, @ThreadedProcedure, Pointer(Self), 0, FThreadID);
FThreadHandle := BeginThread(
nil, 0, @TTest.ThreadedMethod, Pointer(Self), 0, FThreadID);
end;
procedure TTest.ThreadedMethod(Instance: TTest);
begin
//
// < ------- Instance <> Self parameter
//
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)