项目简介和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
时间: 2024-10-10 00:40:09