Socket select()阻止其他UI线程

时间:2017-07-25 07:01:03

标签: c++ mfc

在我的MFC应用程序中,我使用TCP / IP套接字进行通信并从服务器获取数据。在此过程中,我正在显示一个带有静态文本和进度控制的无模型对话框。在通信期间,我正在更新静态文本和进度控制在一个单独的用户线程(AfxBeginThread)。

如果我尝试与错误的ip通信,则套接字选择具有超时值5秒的功能,阻止显示带有静态文本和进度控制的对话框(即对话框挂起,控件将显示)。

一旦套接字从select函数中弹出,对话框就会正确显示。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在MFC中,我强烈建议使用}\n{,并在数据从服务器进入时作出反应。您可能根本不需要启动线程。

如果您要为部分工作启动一个单独的线程,那么您希望以不同的方式将任务分配给线程。您总是希望在主线程(默认情况下创建的线程)中保留UI更新。如果您打算使用(例如)阻塞套接字,并在其上调用select,则您希望将 工作移动到单独的线程,并将UI更新保留在线程中这是默认创建的。然后处理套接字的线程可以(例如)向UI线程发送消息,告诉它发生了什么,因此它可以适当地更新UI。但是,如前所述,您可能只想使用CAsyncSocket,在这种情况下,您根本不需要第二个线程。