我需要一些关于在delphi中重新编写函数循环的建议

我需要一些关于在delphi中重新编写函数循环的建议,delphi,Delphi,我目前正在使用下面的代码在聊天系统中生成我的用户列表,但我注意到,过了一段时间,或者有太多用户在线,循环变得非常无法执行,并且将丢失或添加假用户,因此是否有其他方法生成相同类型的信息,但更稳定?我想可能是stringlist,但不知道如何添加所需的信息下面 function GetLobbyUsers(const aLobbyID: string): string; var i: Integer; HostID: string; begin R

我目前正在使用下面的代码在聊天系统中生成我的用户列表,但我注意到,过了一段时间,或者有太多用户在线,循环变得非常无法执行,并且将丢失或添加假用户,因此是否有其他方法生成相同类型的信息,但更稳定?我想可能是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;

感谢作为一个聊天系统并假设SocketServer.Client是已连接用户的列表,当您仍在迭代用户列表时,用户是否可能正在连接和断开连接?如果是这样,那么可以在您仍在迭代时修改SocketServer.ClientCount,这将非常糟糕。这可能解释了为什么会出现假用户(即在迭代时断开连接)或丢失用户(在仍在迭代时连接)。如果是这种情况,则可能需要在迭代SocketServer.Client时锁定它,即防止从列表中添加或删除项。或者创建SocketServer.Client的副本并迭代该副本。无论如何,性能是至关重要的,因此您需要非常快速地迭代用户列表

为了获得更好的性能,我不会多次调用SocketServer.Client[I]。设置一个引用,如
user:=SocketServer.Client[i]然后用user替换所有那些SocketServer.Client[i]


我还认为将一个字符串与所有用户连接起来似乎很奇怪,可能会影响性能。似乎您可以在每次迭代中构建一个字符串并将其添加到TStringList中。

是的,排序后的TStringList可能会更好,而且根据Delphi的版本,可能还有更好的替代方案。至少,这段代码在风格上有很多问题。您可能应该在代码评审中发布它。有一件事:您将HostID设置为CompareText的成功/失败结果-是这样吗?HostID只是Lobble的所有者,如果它为空,则为空,否则它将显示名称我正在使用Delphi Xe2我正在考虑stringlist我自己,但我确实认为问题在于用户断开连接,因此需要检查客户端[I]是否也是索引