天天看点

socket服务器显示未响应,“程序未响应”的思考总结

在开发聊天程序客户端的过程中,我碰到了一个问题:当运行客户端成后,打开任务管理器,显示程序未相应。我就想是什么原因导致我的程序未响应呢?是我的程序里面有bug?

我上网查了一下,有人说可能程序本身就有bug,有人说有可能程序里面有while无限循环。我的感觉是可能是第二种情况,因为我的程序里面为了和服务器进行连接,创建了绘画套接字,而因此从服务器recv数据,我们都知道recv在不进行任何设置的情况下是阻塞函数,它会一直等待对方发送的数据。而确实我有这样的一个句子,while(ERROR_SOCKET!=recv(....)),所以我想问题可能是出在这里吧。但是,我想在套接字编程里面必须要这样才能不停地接收对方传送过来的数据,再说我也看过有关套接字编程的例子程序,而那些程序怎么就没有说是“未响应”呢?

直觉告诉我,问题可能不在这里。然后我就想调用这个接收数据的函数是什么呢?一看,原来是MFC的消息相应函数,顺着这个东西我就想,程序未响应的最直接的表现就是:当程序运行起来以后,你再去点击UI界面,UI根本不响应你的任何输入操作。按照道理,windows程序会时时监控有什么外部操作,进而根据这些外部消息进行处理,现在不处理了,说明什么?并且我们知道消息处理是同步的,也就是说每一次只处理一个消息。我终于明白了,肯定是在消息处理函数中我调用了接收数据函数,而在这个函数中又调用了阻塞函数recv,recv一直处于阻塞等待状态,所以函数没有返回,消息处理函数也没有返回,所以windows不能再处理任何对UI的操作。

有这个问题我想到了本该很清楚的一个道理,那就是将UI与你的设计逻辑分开。确实是这样的,UI就是UI,它在处理完事件之后应该立即返回,除非是一些特殊的用法。这也是大部分项目中,有专门搞UI设计的,有专门搞逻辑设计的原因吧。

最后,处理我的这类问题的一个最简单的方法就是,创建一个接收数据的线程,有这个线程专门执行接受任务,这样消息处理在主线程中,就不会出现我的那种错误了。