我正在尝试在多线程C++窗口应用程序中以非阻塞模式使用Borland TClientSocket组件。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我将thread类的成员函数指定为套接字的OnConnect、OnDisconnect和OnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TThread::Execute()函数内部调用TClientSocket::Open()函数时,OnConnect事件都不会触发。但是,当我在调用TThread::Execute()函数之前从VCL线程调用Open()函数时,所有事件都会触发,并且我可以随心所欲地使用线程-套接字组合。现在,我还没有在文档中读到任何关于在线程中使用TClientSocket时不应该以非阻塞模式使用的内容,但我觉得我尝试使用这个类的方式在概念上可能有问题。Borland的文档在这个问题上相当糟糕,这些组件现在已经被弃用,所以很难获得可靠的信息。尽管被弃用,但我不得不使用它们,因为在我拥有的Builder 6包中没有其他选择。有没有人可以建议我结合使用TThread和非阻塞TClientSocket的正确/错误的方法。我使用它作为VCL线程的一部分从来没有遇到过问题,以前使用TServerSocket也从来没有遇到过问题,我真的不能理解为什么有些事件不会触发。
发布于 2013-03-12 08:08:33
非阻塞模式下的TClientSocket在内部使用隐藏窗口来接收套接字事件。如果在TThread中使用非阻塞TClientSocket,则必须在TThread::Execute()方法中实现一个消息循环,以便将这些消息分派到套接字的窗口。此外,由于是基于窗口的,这也意味着套接字消息将被发送到实际创建套接字窗口的线程,因此您必须确保从TThread::Execute()方法内部打开TClientSocket。
顺便说一句,BCB6附带了Indy8,这是另一种选择。您还可以安装最新版本的Indy,甚至可以安装另一个第三方库,如ICS或Synapse。
https://stackoverflow.com/questions/15350267
复制相似问题