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