gpt4 book ai didi

c++ - CAsyncSocket 和线程

转载 作者:行者123 更新时间:2023-11-28 01:13:26 25 4
gpt4 key购买 nike

我正在使用 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/

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