首页 > 解决方案 > Indy 10 TcpServer 创建新线程

问题描述

https://stackoverrun.com/de/q/11468851上有一个来自 Remy Lebeau 的很好的例子,用于在 TIdTCPServer.OnExecute 过程中使用外部 TIdContext。但这仅在 Indy 9 之前有效。在 Indy 10 中引入了新的 Thread 机制。TIdContext 不再直接连接到连接。现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?

标签: multithreadingconnectionindy10tcpserver

解决方案


https://stackoverrun.com/de/q/11468851上有一个来自 Remy Lebeau 的很好的例子,用于在 TIdTCPServer.OnExecute 过程中使用外部 TIdContext。

那篇文章只是 StackOverflow 上这个问题的反映:

TIdTCPServer 访问自定义 AContext 属性

但这仅在 Indy 9 之前有效。

不对。该示例是为 Indy 10 编写的。

Indy 10 引入了新的线程机制。TIdContext 不再直接连接到连接。

TIdContext实际上是在 Indy 10 中引入的,用于将用户数据与线程分开。这个想法是可以允许每个客户端上下文在多个线程/光纤1之间移动。但是,TIdContext确实有一个Yarn属性,可以将其类型转换TIdYarnOfThread为访问当前正在运行的TIdThreadWithTask底层TIdContext

1:但实际上,这从未针对线程实现,并且光纤支持没有奏效,因此被放弃了。

Indy 9 及更早版本用于TIdPeerThread直接在线程中跟踪用户数据。 TIdPeerThread在 Indy 10 中不存在,它被替换为TIdThreadWithTaskand TIdContext(派生自TIdTask)。

现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?

如果您想在 Indy 10 中创建自定义线程TIdTCPServer,而不是(或可能除了)自定义上下文类,那么您可以执行以下操作:

  • 根据需要派生自定义类TIdThreadWithTask及其方法。overridevirtual

  • 显式地将TIdSchedulerOfThread...组件 (TIdSchedulerOfThreadDefaultTIdSchedulerOfThreadPool)分配给TIdTCPServer.Scheduler属性。如果您不这样做,TIdTCPServer将为自己创建一个内部TIdSchedulerOfThreadDefault,并且您将没有机会告诉它使用哪种线程类。

  • 将您的线程类类型分配给调度程序的ThreadClass属性。

这相当于从 Indy 9 派生TIdPeerThread和设置TIdTCPServer.ThreadClass


推荐阅读