1. 程式人生 > >同步異步和阻塞3-同步阻塞

同步異步和阻塞3-同步阻塞

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-同步阻塞