procedure Ttcpthread.addonline;
var
  userdata: Ruserdata;
begin
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata));
  EnterCriticalSection(CS);
  setlength(online, high(online) + 2);
  online[high(online)] := userdata;
  //更新显示
  with onlineview.Items.Add do
  begin
    Caption := userdata.username;
    imageindex := userdata.whatdoing;
    subitems.Add(userdata.email);
  end;
  LeaveCriticalsection(CS);
end

解决方案 »

  1.   

    procedure Ttcpthread.addonline;
    var
      userdata: Ruserdata; //定义数据类型
    begin
      IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 读取userdate数据岛indy控件中
      EnterCriticalSection(CS); //进入保护临界状态,就是其他线程不能访问
      setlength(online, high(online) + 2); 设置online数组数据个数加2,就是可以多存放两个
      online[high(online)] := userdata; 把userdate赋值给online数据最大下标的那个
      //更新显示
      with onlineview.Items.Add do         //在listview中显示数据
      begin
      Caption := userdata.username;         //第一列显示userdata结构体重的username字段
      imageindex := userdata.whatdoing;     //设置图标索引值为结构体中的whatdoing子都
      subitems.Add(userdata.email);         //添加第二列为结构体中email字段
      end;
      LeaveCriticalsection(CS);             //离开保护状态
    end
      

  2.   

    IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); //TCPIP 端口读取数据
      EnterCriticalSection(CS); //进入多线程临界区,防止重复进入
      setlength(online, high(online) + 2); //设置公共变量缓冲区大小
      online[high(online)] := userdata;   //把读取的数据进行 传递给公共变量
      //更新显示 
      with onlineview.Items.Add do  //显示到View 控件上
      begin
      Caption := userdata.username;   名字
      imageindex := userdata.whatdoing; 图片
      subitems.Add(userdata.email);
      end;
      LeaveCriticalsection(CS);  //释放临界区