gpt4 book ai didi

Delphi TIdTCPServer 处理多个请求

转载 作者:行者123 更新时间:2023-12-02 09:39:30 35 4
gpt4 key购买 nike

我正在使用 TidTCPServer 和 TidTCPClient 在 delphi 中开发消息系统。

首先,所有客户端都使用用户名和密码登录。服务器使用ADO组件在SQL Server中搜索用户数据。此后,客户端每 10 秒向服务器发送多个请求,告诉服务器他们在线并获取联系人列表的状态。所有这些请求最终都会读取或修改 SQL 表。

有时我会收到此错误:异步执行时无法执行操作。它是由 ADO 提出的。我认为 TCP 服务器异步工作,同时对 ADODataset 进行多次访问是问题所在。我应该怎么办?我是否应该将传入的请求放入一个列表中并逐一处理它们,直到列表清晰为止?

最佳答案

TIdTCPServer 是一个多线程组件。每个客户端都在自己的工作线程中运行。

ADO 是一组单元线程 COM 对象。除非对它们进行编码(marshal),否则您无法跨线程边界共享它们。

您必须:

  1. 为每个线程提供自己的数据库连接和查询组件。 (可选)将对象放入池中以控制一次运行的事件连接/查询的数量。当从池中取出连接时,池可以处理必要的编码。

  2. 将查询委托(delegate)给专用线程,该线程运行查询并将结果发送回适当的线程。

  3. 切换到另一个更好支持线程访问的数据库框架,例如 dbExpress。

就我个人而言,我使用 #3 的共用版本。当客户端需要执行查询时,它从池中获取一个TSQLConnection(如果需要,将其连接到数据库),创建一个TSQLQuery对象,执行查询,读取结果,然后将 TSQLConnection 放回池中。该池有一个专门的线程来监视哪些连接正在使用,并关闭空闲一段时间的连接。

关于Delphi TIdTCPServer 处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069455/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com