zoukankan      html  css  js  c++  java
  • 同步异步和阻塞3-同步阻塞

    项目简介和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

  • 相关阅读:
    vue+sass 下sass不能运行问题
    Servlet3.0的新特性
    Servlet监听器
    Servlet过滤器
    会话跟踪
    Servlet的应用
    Servlet概述
    《南怀瑾讲述99个人生道理》——刘清海编著
    Web应用程序简介
    JDBC学习总结(五)
  • 原文地址:https://www.cnblogs.com/organic/p/7783935.html
Copyright © 2011-2022 走看看