【问题标题】: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 中不存在,它被替换为 TIdThreadWithTaskTIdContext(派生自 TIdTask)。

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

    如果你想在 Indy 10 中为 TIdTCPServer 创建一个自定义 thread 类,而不是(或者可能是除了)自定义 context 类,那么你可以执行以下操作:

    • 根据需要从TIdThreadWithTaskoverride 及其virtual 方法派生自定义类。

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

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

    这相当于从 TIdPeerThread 派生并在 Indy 9 中设置 TIdTCPServer.ThreadClass

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2015-11-05
      • 2020-01-06
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多