Nein, das funktioniert eben nur deswegen mit TStrings, weil die Übergabe von einem Thread auf den anderen mit einem String erfolgt. Durch die implizite Referenzzählung bei Strings erfolgt die Freigabe erst dann, wenn der String nicht mehr gebraucht wird.
Wenn du Objekt-Instanzen übergeben willst, musst du dir über die Ownership klar werden. Du kannst eine Transport-Instanz des Objekts erzeugen und diese dann in der anonymen Methode freigeben:
Delphi-Quellcode:
procedure TSQLGetUser.DoUpdateUserList(UserList: TUserList);
var
MyUserList: TUserList;
begin
if Assigned(FOnUpdateUserList) then
begin
MyUserList:=TUserList.Create(True);
UserList.AssignTo(MyUserlist);
TThread.Queue(nil,
procedure
begin
try
FOnUpdateUserList(Self, MyUserList);
finally
MyUserList.Free;
end;
end);
end;
end;
Es wäre auch interessant zu sehen, was in AssignTo gemacht wird.
Abgesehen davon ist gewinnt dein Beispiel nicht wirklich durch Queue. Da nach dem Synchronize eh nur noch aufgeräumt wird, bringt eine Nebenläufigkeit hier gar nicht so viel.