如何将TWSocket的OnDataAvailable()事件推送到我的Delphi 6应用程序中的后台线程?

时间:2011-12-02 07:01:27

标签: multithreading delphi sockets vcl

我有一个Delphi 6应用程序,它使用ICS组件套件来进行套接字通信。我有自己的服务器套接字VCL组件,当新会话可用时创建客户端TWSocket套接字。我创建的客户端套接字确实将Multithreaded属性设置为TRUE,但所做的只是将客户端套接字处理套接字消息的方式更改为对后台线程(非主VCL线程)安全的方式。 TWSocket不会产生一个线程来处理套接字数据流量,这就是我所需要的。

我需要在主VCL线程(主用户界面线程)之外进行接收调用,因为到客户端套接字的传入数据是需要在50-100毫秒或更短时间内快速处理的音频数据。换句话说,主VCL线程和音频流上的一次打嗝被中断。这就是为什么我想推送OnDataAvailable()事件,只要传入数据可用于高优先级后台线程,就会触发该事件。换句话说,我想强制属于客户端TWSocket对象的消息处理循环到后台线程。

我相信我可以通过后台线程创建客户端套接字来实现这一点,但我希望避免这种情况,因为目前我使用的VCL组件充当套接字服务器。这是接受传入连接并生成客户端套接字的实体。套接字服务器是在主VCL线程上创建的。

因此我的问题是,是否有(相对)简单的方法来创建客户端套接字,以便他们使用现有的后台线程来进行套接字处理,尤其是FD_RECV消息处理?如果不是现有的后台线程,那么我将为我创建的每个客户端套接字创建一个,但我需要知道如何确保新的TWSocket对象在运行其处理套接字消息的消息循环时使用该后台线程,那么如何我这样做?

1 个答案:

答案 0 :(得分:3)

对于其他ICS / TWSocket用户,该解决方案位于该软件包附带的ICS ThrdSrv 演示项目中。仔细看看该项目,特别是它使用ThreadAttach()和ThreadDetach()方法。该示例项目显示了如何创建具有在工作线程上下文中运行的消息泵的客户端套接字。