organic

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

项目简介和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被卡住了(注意鼠标旁的一直在转的圈圈,窗口将不会相应任何操作),不明真相的人民群众可能会以为程序是不是已经挂掉了,直到结果返回。

image

 

当”Stop”按钮可用时,2个IO处理已经完毕了,所以在这种模式下”Stop”并没有用,再长的IO也得等待其完成,即使是IO出错。为了避免无限长的等待,很多IO操作,如果socket,都可以设置timeout

image

posted on 2017-11-04 17:24  organic  阅读(220)  评论(0编辑  收藏  举报