首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CAsyncSocket和线程化

CAsyncSocket和线程化
EN

Stack Overflow用户
提问于 2009-04-06 15:58:40
回答 1查看 3.7K关注 0票数 0

我正在使用MFC CAsyncSocket在多线程环境中进行一些网络通信。在尝试让接受的套接字接受传入数据几个小时后,我看到了一个页面,其中指出要调用CAsyncSocket的OnReceive函数,套接字必须位于主GUI线程的上下文中。将其移动到主GUI线程允许套接字开始接收数据。

我的问题是:有没有人知道解决这个问题的办法?套接字之前位于GUI线程上,并且OnAccept调用正常。接受的套接字可以用来发送数据,没有问题,只是不能接收任何东西。如果我能避免的话,我宁愿不必重新设计软件的这一部分。

EN

回答 1

Stack Overflow用户

发布于 2009-04-06 16:58:22

简单地为您的套接字创建一个具有自己的消息队列的单独线程会不会更简单?我不认为CAsyncSocket需要在主消息队列上创建,只需要在一些消息队列上创建即可。有关如何使用自己的CWinThread兼容消息队列创建单独线程的信息,请参见MFC文档。

不幸的是,从新线程的上下文调用所有套接字操作是至关重要的。MFC在隐藏类中使用全局状态,隐藏类使用线程本地存储来保存每个线程的信息,该信息在CAsynchSocket的许多方法中使用。这意味着CAsynchSocket具有线程亲和性,您必须始终在用作其消息泵的任何线程中使用和创建它。

一种方法是创建一个CWinThread,在该线程上创建您自己的自定义MFC隐藏窗口(通过在该线程的上下文中创建窗口),并在该窗口上为您执行的所有套接字操作(创建、连接等)创建消息和消息处理程序。确保线程正在发送消息( "Run()“方法可以做到这一点),然后向窗口发送/发送消息以控制套接字。

此外,请记住,来自套接字的回调将在与UI或工作线程不同的线程上传入。如果要更新GUI对象,则需要考虑竞争条件和可能的GUI线程亲和性问题。

如果你担心设计的影响,只需创建你自己的CThreadSafeAsynchSocket代理对象,并通过消息传递到你的隐藏窗口来委托给真正的实现。您可以使用SendMessage进行阻塞操作,使用PostMessage进行异步操作。如果将构造函数包装在工厂对象中,则可以将套接字线程的创建延迟到需要时再创建。

我能想到的最后一个问题是,您需要检测所有代理何时都已离开并关闭线程。您可以使用由CThreadSafeAsynchSocket的构造函数/析构函数管理的全局引用计数来检测何时关闭线程。如果不能关闭线程,即使在关闭应用程序主窗口后,也会使应用程序在隐藏窗口中挂起。

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

https://stackoverflow.com/questions/722098

复制
相关文章

相似问题

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