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;