Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy,发送线程并销毁上下文_Delphi_Tcp_Delphi 2009_Indy - Fatal编程技术网

Delphi Indy,发送线程并销毁上下文

Delphi Indy,发送线程并销毁上下文,delphi,tcp,delphi-2009,indy,Delphi,Tcp,Delphi 2009,Indy,我使用Indy的TIdTCPServer(D2009,Indy 10)与客户端应用程序通信。在OnExecute方法中,我创建了一个任务并将其排队。工作线程执行任务并将其放入发送队列。然后,发送队列将响应发送到客户端 在发送线程中,我循环遍历服务器的上下文列表,并查找与任务中存储的IP和端口信息匹配的上下文。然后遵循一些send命令,这些命令有时会抛出访问冲突(我猜上下文在发送过程中会被破坏) 现在我要问的问题是:在发送响应之前,如何确保上下文没有关闭?Indy是否可以从单独的线程发送数据,或者

我使用Indy的TIdTCPServer(D2009,Indy 10)与客户端应用程序通信。在OnExecute方法中,我创建了一个任务并将其排队。工作线程执行任务并将其放入发送队列。然后,发送队列将响应发送到客户端

在发送线程中,我循环遍历服务器的上下文列表,并查找与任务中存储的IP和端口信息匹配的上下文。然后遵循一些send命令,这些命令有时会抛出访问冲突(我猜上下文在发送过程中会被破坏)


现在我要问的问题是:在发送响应之前,如何确保上下文没有关闭?Indy是否可以从单独的线程发送数据,或者所有操作都应该在Indy线程中完成?

您可以尝试在发送数据时锁定TIdTCPServer.Contexts列表,因为上下文直到从列表中删除后才会释放。缺点是,当一次发送正在进行时,不会处理任何客户端连接/断开连接/发送

或者,只需将发送代码包装在try/except块中,并忽略可能发生的任何错误


或者,如果您可以重新编写代码以将发送队列移动到上下文本身中,那么最好是这样,是的。然后,OnExecute事件处理程序可以定期检查队列,并在可用时发送数据。这也将有助于提高性能,因为如果同时为多个客户端准备好了传出数据,则不再序列化发送。

+1谢谢!我正在考虑重组,并将所有通信代码放在OnExecute中。