首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在非阻塞模式下的TThread中使用TClientSocket时,OnConnect事件不会激发

在非阻塞模式下的TThread中使用TClientSocket时,OnConnect事件不会激发
EN

Stack Overflow用户
提问于 2013-03-12 06:59:00
回答 1查看 795关注 0票数 1

我正在尝试在多线程C++窗口应用程序中以非阻塞模式使用Borland TClientSocket组件。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我将thread类的成员函数指定为套接字的OnConnectOnDisconnectOnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TThread::Execute()函数内部调用TClientSocket::Open()函数时,OnConnect事件都不会触发。但是,当我在调用TThread::Execute()函数之前从VCL线程调用Open()函数时,所有事件都会触发,并且我可以随心所欲地使用线程-套接字组合。现在,我还没有在文档中读到任何关于在线程中使用TClientSocket时不应该以非阻塞模式使用的内容,但我觉得我尝试使用这个类的方式在概念上可能有问题。Borland的文档在这个问题上相当糟糕,这些组件现在已经被弃用,所以很难获得可靠的信息。尽管被弃用,但我不得不使用它们,因为在我拥有的Builder 6包中没有其他选择。有没有人可以建议我结合使用TThread和非阻塞TClientSocket的正确/错误的方法。我使用它作为VCL线程的一部分从来没有遇到过问题,以前使用TServerSocket也从来没有遇到过问题,我真的不能理解为什么有些事件不会触发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-12 08:08:33

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

顺便说一句,BCB6附带了Indy8,这是另一种选择。您还可以安装最新版本的Indy,甚至可以安装另一个第三方库,如ICS或Synapse。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15350267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档