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