同步異步和阻塞3-同步阻塞
阿新 • • 發佈:2017-11-04
handle ron one splay server isp ogre adding ++
項目簡介和code見《同步異步和阻塞2-測試小項目》
1. 實現
bool CSyncIO::OnStart() { //loop to handle IO for (int i = 0; i < 2; i++) { int nRet = IO(); if (m_pCObserver) m_pCObserver->OnProgressByCall(100, i); NotifyResult(nRet, i); } return true; }
同步的實現很簡單,依次call2次 IO() 函數,此時OnStart()由於是在主線程中調用的,IO()函數會阻塞主線程,當IO()完成後然後將結果通知給UI後立即返回。
當然,由於IO是阻塞的,所以所謂的IO處理進度是無法實現的,只有在處理完畢後直接給一個 100 的進度。
2. 測試
在OnStart()未返回前,”Stop”按鈕會變灰,同時,由於IO會阻塞UI主線程,所以會看到UI被卡住了(註意鼠標旁的一直在轉的圈圈,窗口將不會相應任何操作),不明真相的人民群眾可能會以為程序是不是已經掛掉了,直到結果返回。
當”Stop”按鈕可用時,2個IO處理已經完畢了,所以在這種模式下”Stop”並沒有用,再長的IO也得等待其完成,即使是IO出錯。為了避免無限長的等待,很多IO操作,如果socket,都可以設置timeout
同步異步和阻塞3-同步阻塞