代码之家  ›  专栏  ›  技术社区  ›  Lodle

重叠IO和错误IO不完整

  •  3
  • Lodle  · 技术社区  · 14 年前

    我已经重叠IO工作2年了,但是我用它来处理一个新的应用程序,它把这个错误抛给了我(当我隐藏主窗体时)。

    我在谷歌上搜索过,但我不明白这个错误意味着什么,我应该如何处理它?

    有什么想法吗?

    我在NamedPipes上使用这个,调用GetOverlappedResult后发生错误

    DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500);
    
    //check result. Get correct data
    
    BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
    
    // error happens here
    
    1 回复  |  直到 10 年前
        1
  •  6
  •   Blair Holloway    14 年前

    ERROR_IO_INCOMPLETE 表示重叠操作仍在进行的错误代码; GetOverlappedResult 返回false,因为操作尚未成功。

    您有两个选项-阻塞和非阻塞:

    在操作完成之前阻止: 改变你的 GetOverlappedResult结果 呼叫:

    BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE);
    

    这将确保重叠操作在返回结果之前已完成(即成功或失败)。

    投票完成: 如果操作仍在进行中,则可以从函数返回,并在等待结果的同时执行其他工作:

    BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
    if (!fSuccess) {
        if (GetLastError() == ERROR_IO_INCOMPLETE) return; // operation still in progress
    
        /* handle error */
    } else {
        /* handle success */
    }
    

    通常,第二个选项比第一个选项更可取,因为它不会导致应用程序停止并等待结果。(但是,如果代码在单独的线程上运行,则首选第一个选项。)