multithreading - Indy 10 TcpServer 创建新线程
问题描述
在https://stackoverrun.com/de/q/11468851上有一个来自 Remy Lebeau 的很好的例子,用于在 TIdTCPServer.OnExecute 过程中使用外部 TIdContext。但这仅在 Indy 9 之前有效。在 Indy 10 中引入了新的 Thread 机制。TIdContext 不再直接连接到连接。现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?
解决方案
在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 中不存在,它被替换为TIdThreadWithTask
and TIdContext
(派生自TIdTask
)。
现在如何创建一个新线程,例如断开连接或向客户端写入一些数据?
如果您想在 Indy 10 中创建自定义线程类TIdTCPServer
,而不是(或可能除了)自定义上下文类,那么您可以执行以下操作:
根据需要派生自定义类
TIdThreadWithTask
及其方法。override
virtual
显式地将
TIdSchedulerOfThread...
组件 (TIdSchedulerOfThreadDefault
或TIdSchedulerOfThreadPool
)分配给TIdTCPServer.Scheduler
属性。如果您不这样做,TIdTCPServer
将为自己创建一个内部TIdSchedulerOfThreadDefault
,并且您将没有机会告诉它使用哪种线程类。将您的线程类类型分配给调度程序的
ThreadClass
属性。
这相当于从 Indy 9 派生TIdPeerThread
和设置TIdTCPServer.ThreadClass
。
推荐阅读
- blazor - Blazor 服务器应用程序中带有 Leaflet Markercluster 的 Mapbox
- c# - 使用字符串和增量 int 生成客户 ID
- portable-executable - PEB 的 ImageBaseAddress
- spring - 我如何将排除 maven 代码转换为 gradle
- python - 如何在 Neomodel 中运行时创建关系?
- java - 单声道 switchIfEmpty() 总是被执行
- symfony - Symfony 5 vich_upload 删除文件不起作用
- python - 当两个值相同时执行计算
- python - 如何使用 Sphinx 的 sphinx.ext.coverage 的 coverage_show_missing_items?
- javascript - 当您将鼠标悬停时,Jquery 下拉菜单不会隐藏