我有一个 Delphi 6 应用程序,它使用 ICS 组件套件进行套接字通信。我有自己的服务器套接字 VCL 组件,当新会话可用时,它会创建客户端 TWSocket 套接字。我创建的客户端套接字确实将 Multithreaded 属性设置为 TRUE,但所做的只是将客户端套接字处理套接字消息的方式更改为对后台线程(非主 VCL 线程)安全的方式。 TWSocket 不会生成线程来处理套接字数据流量,而这正是我所需要的。
我需要让接收调用发生在主 VCL 线程(主用户界面线程)之外,因为客户端套接字的传入数据是需要在 50-100 毫秒或更短时间内快速处理的音频数据。换句话说,主 VCL 线程出现故障,音频流就会中断。这就是为什么我想将每当传入数据可用时触发的 OnDataAvailable() 事件推送到高优先级后台线程。换句话说,我想将属于客户端 TWSocket 对象的消息处理循环强制到后台线程。
我相信我可以通过后台线程创建客户端套接字来做到这一点,但我希望避免这种情况,因为目前我使用我制作的充当套接字服务器的 VCL 组件。这是接受传入连接并生成客户端套接字的实体。套接字服务器在主 VCL 线程上创建。
因此我的问题是,是否有一种(相对)简单的方法来创建客户端套接字,以便它们使用现有的后台线程来进行套接字处理,特别是 FD_RECV 消息处理?如果不是现有的后台线程,那么我将为我创建的每个客户端套接字创建一个,但我需要知道如何确保新的 TWSocket 对象在运行处理套接字消息的消息循环时使用该后台线程,那么如何我这样做?
对于其他 ICS/TWSocket 用户,解决方案位于 ICSThrdSrv软件包附带的演示项目。仔细查看该项目,尤其是它对 ThreadAttach() 和 ThreadDetach() 方法的使用。该示例项目展示了如何创建具有在工作线程上下文中运行的消息泵的客户端套接字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)