- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 MFC CAsyncSocket 在多线程环境中进行一些网络通信。在尝试让接受的套接字接受传入数据几个小时后,我遇到了一个页面,该页面指出要调用 CAsyncSocket 的 OnReceive 函数,套接字必须位于主 GUI 线程的上下文中。将其移至主 GUI 线程已允许套接字开始接收数据。
我的问题是:有人知道解决这个问题的方法吗?套接字之前在 GUI 线程上,并且 OnAccept 被调用得很好。接受的套接字可以用来发送数据没问题,只是无法接收任何东西。如果可以避免的话,我宁愿不必重新设计软件的这一部分。
最佳答案
简单地为您的套接字创建一个具有自己的消息队列的单独线程会更简单吗?我不认为 CAsyncSocket 需要在主消息队列上创建,只是一些消息队列。请参阅 CWinThread 的文档以了解如何使用其自己的 MFC 兼容消息队列创建单独的线程。
不幸的是,从新线程的上下文中调用所有套接字操作至关重要。 MFC 在使用线程本地存储的隐藏类中使用全局状态来保存每个线程的信息,并且该信息用于许多 CAsynchSocket 的方法中。这意味着 CAsynchSocket 具有线程亲和性,您必须始终在任何线程中使用和创建它作为其消息泵。
一种方法是创建一个 CWinThread,在该线程上创建您自己的自定义 MFC 隐藏窗口(通过在该线程的上下文中创建窗口),并在该窗口上为所有套接字操作创建消息和消息处理程序(创建、连接等)你做的。确保线程正在发送消息(“Run()”方法执行此操作),然后将消息发布/发送到您的窗口以控制您的套接字。
此外,请记住,来自套接字的回调将进入与 UI 或工作线程不同的线程。如果您要更新 GUI 对象,您需要担心竞争条件和可能的 GUI 线程关联问题。
如果您担心设计影响,只需创建您自己的 CThreadSafeAsynchSocket 代理对象并通过将消息传递到您的隐藏窗口委托(delegate)给真正的实现。您可以使用 SendMessage 进行阻塞操作,使用 PostMessage 进行异步操作。如果将构造函数包装在工厂对象中,则可以延迟创建套接字线程,直到需要为止。
我能想到的最后一个问题是,您需要检测所有代理何时消失并关闭线程。您可以使用由 CThreadSafeAsynchSocket 的构造函数/析构函数管理的全局引用计数来检测何时关闭线程。未能关闭线程将使您的应用程序在隐藏窗口中挂起,即使在您关闭主应用程序窗口后也是如此。
关于c++ - CAsyncSocket 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722098/
我正在寻找一种无需子类化即可使用 CAsyncSocket 的方法。到目前为止,在我发现的所有示例和教程中,它们都是它的子类,我想避免使用它。 提前致谢 最佳答案 CAsyncSocket 旨在通过子
我正在使用 MFC CAsyncSocket 在多线程环境中进行一些网络通信。在尝试让接受的套接字接受传入数据几个小时后,我遇到了一个页面,该页面指出要调用 CAsyncSocket 的 OnRece
我有当前使用 CAsyncSocket 的控制台应用程序。我需要实现 SSL,所以经过一番搜索后我找到了这个项目:http://www.codeproject.com/Articles/3915/CA
所以,文档说: http://msdn.microsoft.com/zh-cn/library/ct7d990b(v=VS.80).aspx “Receive 返回接收到的字节数。如果连接已关闭,则返
如果我在调用 Connect 之后但在 OnConnect 之前删除 CAsyncSocket, CAsyncSocket 会使我的应用程序崩溃回调已被调用。 ASSERT(pSocket != NU
我有一个具有这种结构的服务器应用程序:有一个对象,称他为服务器,它在无休止的循环中监听和接受连接。我有来自 CAsyncSocket 的后代类,它覆盖了事件 OnReceive,称他为 ProxySo
我被要求为 friend 查看一些代码。 (由于 MFC 和很多糟糕的代码,我犹豫是对的,但他赢了……) 这是一个基于对话框的应用程序,使用了 CAsyncSocket。 问题表现为一些不间断的调试中
我是一名优秀的程序员,十分优秀!