我目前正在使用下面的代码在我的聊天系统中生成我的用户列表但是我注意到在一段时间或太多用户在线后,循环变得非常无法并且会错过或添加假用户,所以是否有任何其他方式生成相同类型信息但更稳定我想的可能是stringlist但不知道如何在下面添加所需的信息。
function GetLobbyUsers(const aLobbyID: string): string;
var
i: Integer;
HostID: string;
begin
Result := '';
for i := 0 to (SocketServer.ClientCount -1) do
begin
if (CompareText(SocketServer.Client[i].Lobby, aLobbyID) = 0) then
begin
HostID := '';
HostID := IntToStr(Integer(CompareText(SocketServer.Client[i].LobbyOwner, SocketServer.Client[i].Name) = 0));
//
SocketServer.Client[i].HasHighLatancy := False;
SocketServer.Client[i].HasLowLatancy := False;
SocketServer.Client[i].IsCheckingLatancy := True;
//
Result := Result + 'š11œ' + aLobbyID + 'œ'
+ SocketServer.Client[i].Name + 'œ'
+ SocketServer.Client[i].Rank + 'œ'
+ SocketServer.Client[i].IconNumber + 'œ'
+ SocketServer.Client[i].BIconNumber + 'œ'
+ MBoolToStr(SocketServer.Client[i].IsAFK) + 'œ'
+ HostID + 'œ'
+ SocketServer.Client[i].HasTrophy + 'œ'
+ MBoolToStr(SocketServer.Client[i].IsDownloading) + 'œ'
+ MBoolToStr(SocketServer.Client[i].HasHighLatancy) + 'œ'
+ MBoolToStr(SocketServer.Client[i].HasLowLatancy) + 'œ'
+ MBoolToStr(SocketServer.Client[i].IsCheckingLatancy) + 'œ'
+ MBoolToStr(SocketServer.Client[i].IsBlocked) + 'œ';
end;
end;
end;
由于
答案 0 :(得分:0)
作为聊天系统并假设SocketServer.Client是已连接用户的列表,当您仍在迭代用户列表时,用户是否可以连接和断开连接?如果是这样,那么当您仍在迭代时,可以修改SocketServer.ClientCount,这将是非常糟糕的。这可能解释了为什么你会得到假用户(即迭代时断开连接)或缺少用户(在迭代时连接)。如果是这种情况,那么您可能需要在迭代时锁定SocketServer.Client,即阻止在列表中添加或删除项目。或者可以创建SocketServer.Client的副本并迭代副本。无论如何,性能至关重要,因此您需要非常快速地迭代用户列表。
为了获得更好的性能,我不会多次调用SocketServer.Client [i]。设置像user := SocketServer.Client[i];
这样的引用,然后将所有这些SocketServer.Client [i]替换为user。
我还认为将一个字符串与所有用户连接似乎很奇怪,可能会影响性能。看起来你可以在每次迭代中构建一个字符串并将其添加到TStringList。