1

我正在尝试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 的问题,我真的不明白为什么有些事件没有触发。

4

1 回答 1

2

TClientSocket在非阻塞模式下,内部使用隐藏窗口来接收套接字事件。如果在 a 中使用非阻塞TClientSocketTThread则必须在TThread::Execute()方法内部实现消息循环,以便将这些消息分派到套接字的窗口。此外,作为基于窗口的,这也意味着套接字消息被发送到实际创建套接字窗口的线程,因此您必须确保TClientSocketTThread::Execute()方法内部打开。

顺便说一句,BCB6 附带 Indy 8,这是一个替代方案。您还可以安装最新版本的 Indy,甚至是 ICS 或 Synapse 等其他第三方库。

于 2013-03-12T00:08:32.560 回答