码迷,mamicode.com
首页 > 其他好文 > 详细

同步异步和阻塞3-同步阻塞

时间:2017-11-04 19:29:15      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:star   notify   鼠标   and   strong   同步异步   art   htm   ges   

项目简介和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-同步阻塞

标签:star   notify   鼠标   and   strong   同步异步   art   htm   ges   

原文地址:http://www.cnblogs.com/organic/p/7783935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!