socket服务器显示未响应,“程序未响应”的思考总结
在開發聊天程序客戶端的過程中,我碰到了一個問題:當運行客戶端成后,打開任務管理器,顯示程序未相應。我就想是什么原因導致我的程序未響應呢?是我的程序里面有bug?
我上網查了一下,有人說可能程序本身就有bug,有人說有可能程序里面有while無限循環。我的感覺是可能是第二種情況,因為我的程序里面為了和服務器進行連接,創建了繪畫套接字,而因此從服務器recv數據,我們都知道recv在不進行任何設置的情況下是阻塞函數,它會一直等待對方發送的數據。而確實我有這樣的一個句子,while(ERROR_SOCKET!=recv(....)),所以我想問題可能是出在這里吧。但是,我想在套接字編程里面必須要這樣才能不停地接收對方傳送過來的數據,再說我也看過有關套接字編程的例子程序,而那些程序怎么就沒有說是“未響應”呢?
直覺告訴我,問題可能不在這里。然后我就想調用這個接收數據的函數是什么呢?一看,原來是MFC的消息相應函數,順著這個東西我就想,程序未響應的最直接的表現就是:當程序運行起來以后,你再去點擊UI界面,UI根本不響應你的任何輸入操作。按照道理,windows程序會時時監控有什么外部操作,進而根據這些外部消息進行處理,現在不處理了,說明什么?并且我們知道消息處理是同步的,也就是說每一次只處理一個消息。我終于明白了,肯定是在消息處理函數中我調用了接收數據函數,而在這個函數中又調用了阻塞函數recv,recv一直處于阻塞等待狀態,所以函數沒有返回,消息處理函數也沒有返回,所以windows不能再處理任何對UI的操作。
有這個問題我想到了本該很清楚的一個道理,那就是將UI與你的設計邏輯分開。確實是這樣的,UI就是UI,它在處理完事件之后應該立即返回,除非是一些特殊的用法。這也是大部分項目中,有專門搞UI設計的,有專門搞邏輯設計的原因吧。
最后,處理我的這類問題的一個最簡單的方法就是,創建一個接收數據的線程,有這個線程專門執行接受任務,這樣消息處理在主線程中,就不會出現我的那種錯誤了。
總結
以上是生活随笔為你收集整理的socket服务器显示未响应,“程序未响应”的思考总结的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: css不常用,不常用的 CSS
- 下一篇: 9月4日服务器例行维护公告,《诺亚传说手
