2014-09-26 155 views
2

我正在使用TidTCPServer和TidTCPClient在delphi中开发一个消息系统。Delphi TIdTCPServer处理多个请求

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

有时会出现此错误:Operation cannot be performed while executing asynchronously。它由ADO提出。我认为TCP服务器异步工作,同时多次访问ADODataset是个问题。我该怎么办?我应该将传入的请求放入一个列表中并逐个处理它们,直到列表清楚为止?

回答

3

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

ADO是一套公寓线程的COM对象。除非你编组,否则你不能跨线程分享。

你将不得不要么:

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

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

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

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