Delphi 从Indy 10线程管理Listview项目的最佳方法

Delphi 从Indy 10线程管理Listview项目的最佳方法,delphi,object,indy,Delphi,Object,Indy,我正在制作一个多用户远程管理工具,一种VNC,但它支持多远程桌面查看器,有点像Teamviewer 我有一个Delphi表单,它只包含一个TListview,这个listview包含当前连接到服务器的用户列表 断开连接后,listview项将被删除 出于某种原因,我在删除多个项目时遇到了一些随机问题,例如,如果我决定刷新整个服务器连接,如果我有多个listview项目,它就会开始发疯 有时不会显示错误,只是一些项目仍在列表中,有时会显示“地址冲突错误” 正如我以前使用纯Winsock API来创

我正在制作一个多用户远程管理工具,一种VNC,但它支持多远程桌面查看器,有点像Teamviewer

我有一个Delphi表单,它只包含一个TListview,这个listview包含当前连接到服务器的用户列表

断开连接后,listview项将被删除

出于某种原因,我在删除多个项目时遇到了一些随机问题,例如,如果我决定刷新整个服务器连接,如果我有多个listview项目,它就会开始发疯

有时不会显示错误,只是一些项目仍在列表中,有时会显示“地址冲突错误”

正如我以前使用纯Winsock API来创建客户机/服务器应用程序一样,我可能使用了一些不好的Indy组件

关于我管理服务器组件的方法的简短说明

我的应用程序是多服务器的,这意味着用户可以同时创建一个或多个服务器。 当用户创建新服务器时,它将运行一个新线程,该线程将创建一个新的indy Server组件,并设置所需的事件(OnConnect、OnExecute、OnDisconnect)等

使用某些VCL表单的每个命令当然都使用Synchronize()进行同步;德尔菲法

当显示新连接时,我从Server Execute方法创建一个新的listview项,然后将新的listview项设置为AContext.data属性

在OnDisconnect事件中断开连接时,我会删除listview项,然后清空AContext数据,以确保在自动销毁时他不会再这样做

Synchronize(procedure begin
TListItem(AContext.data).Delete;
end);
AContext.data := nil;
当我有一个以上的连接时,这种方法效果很差。在调试之后,即使是同步命令也会同时执行,这可能会导致VCL表单中的冲突


我不是Indy10方面的专家,任何建议都将不胜感激。

通常将数据存储在UI中不是一个好主意

关于如何组织此问题的备选答案:

  • 将用户列表存储在项目的业务层中
  • 使用从业务层获取数据的虚拟模型listview显示用户。例如,请参见第页的答案
  • 以线程安全的方式访问该数据(锁定等)
  • 在Indy 10线程中,以线程安全的方式访问数据(锁定等)
  • 让业务层将数据中的更改通知Indy和UI部分

  • 您可能需要检查.Delete调用是否不止执行一次,并且,您应该调用AContext.Data:=NIL;在.Delete之后,最重要的是,您应该检查AContext.Data是否为NIL;我想你的问题是你对列表项的引用存储得很糟糕,可能想看看。。。玩得高兴(: