我正在尝试TClientSocket
在多线程 C++ Windows 应用程序中以非阻塞模式使用 Borlands 组件。我正在创建多个线程(派生自 的类TThread
),每个线程都创建自己的TClientSocket
对象。然后我分配线程类的成员函数作为套接字的OnConnect
,OnDisconnect
和事件的事件处理程序。OnSocketError
我在这里遇到的问题是,每当我TClientSocket::Open()
从函数内部调用TThread::Execute()
函数时,OnConnect
事件都不会触发。但是,当我在调用Open()
函数之前从 VCL 线程调用函数时TThread::Execute()
,所有事件都会触发,我可以根据需要使用线程-套接字组合。现在我还没有在文档中读到任何内容TClientSocket
在线程内使用时不应在非阻塞模式下使用,但在我看来,我尝试使用此类的方式在概念上可能存在问题。Borland 文档在这个主题上相当糟糕,这些组件现在已被弃用,因此很难获得可靠的信息。尽管已被弃用,但我必须使用它们,因为我拥有的 Builder 6 包中没有其他选择。任何人都可以告诉我是否有正确/错误的使用方式TThread
和非阻塞TClientSocket
组合。我从来没有在使用它作为 VCL 线程的一部分时遇到过问题,也从来没有遇到过使用 TServerSocket 的问题,我真的不明白为什么有些事件没有触发。
问问题
803 次
1 回答
2
TClientSocket
在非阻塞模式下,内部使用隐藏窗口来接收套接字事件。如果在 a 中使用非阻塞TClientSocket
,TThread
则必须在TThread::Execute()
方法内部实现消息循环,以便将这些消息分派到套接字的窗口。此外,作为基于窗口的,这也意味着套接字消息被发送到实际创建套接字窗口的线程,因此您必须确保TClientSocket
从TThread::Execute()
方法内部打开。
顺便说一句,BCB6 附带 Indy 8,这是一个替代方案。您还可以安装最新版本的 Indy,甚至是 ICS 或 Synapse 等其他第三方库。
于 2013-03-12T00:08:32.560 回答