Das Problem hier ist eher deine UserList-Instanz, die du der Queue irgendwie mitgeben willst. Queue blockt ja nicht und der darauf folgende Thread-Code wird quasi direkt nach dem Aufruf ausgeführt. Dieser gibt in deinem Fall als erstes die UserList frei, was zu einem Fehler im Hauptthread führt.
Mit einem temporären String kann man das aber lösen:
Delphi-Quellcode:
procedure TSQLGetUser.DoUpdateUserList(UserList: TUserList);
var
tmpString: string;
begin
if Assigned(FOnUpdateUserList) then
begin
tmpString := UserList.CommaText;
TThread.Queue(nil,
procedure
var
tmpList: TStringList;
begin
tmpList := TStringList.Create;
try
tmpList.CommaText := tmpString;
FOnUpdateUserList(Self, tmpList);
finally
tmpList.Free;
end;
end);
end;
end;
Okay, nun sind meine benötigten Daten doch etwas umfangreicher als eine StringList. Aber was mit einer StringList geht, geht auch mit einer TObjectList;
Also müsste das ja äquivalent funktionieren:
Delphi-Quellcode:
procedure TSQLGetUser.DoUpdateUserList(UserList: TUserList);
var
MyUserList: TUserList;
begin
if Assigned(FOnUpdateUserList) then
begin
MyUserList:=TUserList.Create(True);
Try
UserList.AssignTo(MyUserlist);
TThread.Queue(nil,
procedure
var
QUserList: TUseList;
begin
QUserList:= TUseList.Create(True);
try
MyUserlist.AssignTo(QUserList);
FOnUpdateUserList(Self, QUserList);
finally
QUserList.Free;
end;
end);
Finally
MyUserList.Free;
end;
end;
end;
Okay, die Methode ist anonym. Aber zu welchem Zeitpunkt wird sie ausgeführt? Die Daten werden ja erst innerhalb der anonymen Methode zugewiesen (ist in deinem Beispiel mit der TStringlist ja auch so). Ich nahm jetzt aber an, dass die Queue des Hauptthread selber entscheidet, wann die Methode ausgeführt wird. Und das könnt ja dann auch wieder sein, wenn die Daten (in meinem Beispiel MyUserList) bereits wieder zerstört sind.