【问题标题】:Indy 10 TcpServer create new threadsIndy 10 TcpServer 创建新线程
【发布时间】:2020-09-19 22:33:28
【问题描述】:
在https://stackoverrun.com/de/q/11468851 上,Remy Lebeau 提供了一个在 TIdTCPServer.OnExecute 过程中使用外部 TIdContext 的好例子。但这仅在 Indy 9 之前有效。在 Indy 10 中引入了新的 Thread 机制。 TIdContext 不再直接连接到连接。现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?
【问题讨论】:
标签:
multithreading
connection
indy10
tcpserver
【解决方案1】:
在https://stackoverrun.com/de/q/11468851 上,Remy Lebeau 提供了一个在 TIdTCPServer.OnExecute 过程中使用外部 TIdContext 的好例子。
那篇文章只是 StackOverflow 上这个问题的反映:
TIdTCPServer accessing custom AContext properties
但这仅在 Indy 9 之前有效。
不正确。该示例是为 Indy 10 编写的。
Indy 10 引入了新的线程机制。 TIdContext 不再直接连接到连接。
TIdContext 实际上是在 Indy 10 中引入的,用于将用户数据与线程分开。这个想法是可以允许每个客户端上下文在多个线程/光纤之间移动1。但是,TIdContext 确实有一个Yarn 属性,可以将其类型转换为TIdYarnOfThread 以访问TIdContext 当前正在运行的底层TIdThreadWithTask。
1:但实际上,这从未为线程实现过,并且光纤支持没有奏效,因此被放弃了。
Indy 9 及更早版本使用TIdPeerThread 直接在线程中跟踪用户数据。 TIdPeerThread 在 Indy 10 中不存在,它被替换为 TIdThreadWithTask 和 TIdContext(派生自 TIdTask)。
现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?
如果你想在 Indy 10 中为 TIdTCPServer 创建一个自定义 thread 类,而不是(或者可能是除了)自定义 context 类,那么你可以执行以下操作:
-
根据需要从TIdThreadWithTask 和override 及其virtual 方法派生自定义类。
-
将TIdSchedulerOfThread... 组件(TIdSchedulerOfThreadDefault 或TIdSchedulerOfThreadPool)显式分配给TIdTCPServer.Scheduler 属性。如果您不这样做,TIdTCPServer 将为自己创建一个内部TIdSchedulerOfThreadDefault,您将没有机会告诉它使用哪种线程类。
-
将您的线程类类型分配给调度程序的ThreadClass 属性。
这相当于从 TIdPeerThread 派生并在 Indy 9 中设置 TIdTCPServer.ThreadClass。