TThread.Synchronize (TThread.CurrentThread,
Bist sicher? Nicht Nil!
Du kannst da übergeben was du möchtest - der Wert wird im Prinzip nicht wirklich verwendet.
Die Thread-Instanz wird in einen Record geschrieben:
Delphi-Quellcode:
class procedure TThread.Synchronize(const AThread: TThread; AMethod: TThreadMethod);
var
FSynchronize: TSynchronizeRecord;
begin
FSynchronize.FThread := AThread; // da
FSynchronize.FSynchronizeException := nil;
FSynchronize.FMethod := AMethod;
FSynchronize.FProcedure := nil;
Synchronize(@FSynchronize);
end;
class procedure TThread.Synchronize(const AThread: TThread; AThreadProc: TThreadProcedure);
var
FSynchronize: TSynchronizeRecord;
begin
FSynchronize.FThread := AThread; // oder da
FSynchronize.FSynchronizeException := nil;
FSynchronize.FMethod := nil;
FSynchronize.FProcedure := AThreadProc;
TThread.Synchronize(@FSynchronize);
end;
und dann wird ein
TNotifyEvent
damit aufgerufen:
Delphi-Quellcode:
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False; ForceQueue: Boolean = False);
var
SyncProc: TSyncProc;
SyncProcPtr: PSyncProc;
begin
[...]
if Assigned(WakeMainThread) then
WakeMainThread(SyncProcPtr.SyncRec.FThread);
[...]
end;
der bei einer
VCL-Anwendung mit dieser Methode verbunden ist:
Delphi-Quellcode:
procedure TApplication.WakeMainThread(Sender: TObject);
begin
PostMessage(
Handle, WM_NULL, 0, 0);
end;
Wie man sieht, mit der schönen Instanz die mit Sender übergeben wird, wird schon mal gar nichts gemacht.
(BTW: Bei FMX sieht es auch nicht besser aus)
Fazit
Es ist völlig egal ob man dort eine Instanz des aktuellen Threads, oder irgendeine Instanz oder eine ungültige oder eben einfach gar keine mit
nil
übergibt. Somit besteht kein Grund zur Sorge, wenn jemand dort eine Instanz übergibt.
Darum sollte man hier auch ganz beherzt ein
nil
übergeben, denn das ist kürzer und gaukelt auch keine sonstige Funktionalität vor.