在非阻塞模式下在TThread中使用TClientSocket时,OnConnect事件未触发

时间:2013-03-11 22:59:00

标签: c++ c++builder tthread tclientsocket

我试图在多线程C ++ Windows应用程序中以非阻塞模式使用Borlands TClientSocket组件。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我分配线程类的成员函数,作为套接字的OnConnectOnDisconnectOnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TClientSocket::Open()函数中调用TThread::Execute()函数时,OnConnect事件都不会触发。但是,当我在调用Open()函数之前从VCL线程调用TThread::Execute()函数时,所有事件都会触发,我可以根据需要使用线程 - 套接字组合。现在我没有在文档中读到任何文章,其中说TClientSocket在线程中使用时不应该在非阻塞模式下使用,但在我看来,在我尝试的方式中可能存在一些概念上的错误使用这个课程。 Borland文档在这个问题上相当差,现在这些组件已被弃用,因此很难获得可靠的信息。尽管被弃用,但我必须使用它们,因为我所拥有的Builder 6包中没有其他选择。任何人都可以告诉我,如果有正确/错误的方式使用TThread和非阻塞TClientSocket的组合。我从来没有遇到过使用它作为VCL线程的一部分的问题,以前从未遇到过使用TServerSocket的问题,我真的无法理解为什么有些事件没有被解雇。

1 个答案:

答案 0 :(得分:2)

非阻塞模式下的

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

BTW,BCB6与Indy 8一起发售,这是另一种选择。您还可以安装最新版本的Indy,或者安装其他第三方库,如ICS或Synapse。