gpt4 book ai didi

c++ - 在非阻塞模式下在 TThread 中使用 TClientSocket 时不会触发 OnConnect 事件

转载 作者:行者123 更新时间:2023-11-30 04:20:20 24 4
gpt4 key购买 nike

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

最佳答案

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

顺便说一句,BCB6 随 Indy 8 一起提供,这是一种替代方案。您还可以安装最新版本的 Indy,甚至是其他第三方库,如 ICS 或 Synapse。

关于c++ - 在非阻塞模式下在 TThread 中使用 TClientSocket 时不会触发 OnConnect 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15350267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com