c++ - 是否有可能调用 WriteFile 并且应用程序将永远等待回调?

标签 c++ winapi visual-c++

我调用方法win32::WriteFile,然后调用

WaitForSingleObject( handle, INFINITE )

使用与我在 WriteFile 调用中使用的相同句柄。

是否有可能出现某种情况,让我永远等待......而WriteFile无法完成他的写作?我将写入 512 kB,并且假设我的硬件没有问题。

我希望得到FAIL,而不是永远等待。

最佳答案

当您进行重叠的 I/O 调用时,您将责任委托(delegate)给驱动程序以确保它及时完成。如果驱动程序有错误或硬件出现故障,您将无能为力,当此类低级操作失败时,任何程序都无法继续以有用的方式运行。

请注意,您已将指针传递给驱动程序应该填充的缓冲区,超时到期后继续运行会留下一个悬空指针,驱动程序可能使用该指针来喷射字节当它确实设法完成请求时进入您的流程。您至少必须调用 CancelIo() 来解决这个问题。如果返回 false 则终止进程。

这一切都没有意义,您需要操作系统提供最低限度的服务保证。您也可以在不使用 OVERLAPPED 的情况下调用 WriteFile()。同样的错误驱动程序现在将挂起您的程序。正如 CancelIo() 不太可能挂起一样。没关系,有问题的是司机,而不是你。用户并不是不会注意到机器出现了严重的问题,其他程序也会遭受这种不幸。

不要编写处理极不可能出现的极端情况的代码。最重要的是,不要编写无法有效测试的代码。

关于c++ - 是否有可能调用 WriteFile 并且应用程序将永远等待回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279372/

相关文章:

c++ - AES/CCM 加密和明文长度超过最大消息长度

c++ - Windows 中的 C++ 何时需要 "extern C "?

c++ - 像 Photoshop CS 一样管理窗口 Z 顺序

delphi - 处理 TTN_LINKCLICK 消息后如何知道气球上点击了哪个链接?

c++ - Visual Studio C++ 编译器优化破坏代码?

c++ - 匿名命名空间和命名命名空间之间的函数重载

c++ - 使用具有一维输入的 OpenCV cv::kmeans()

c++ - 在windows + opengl中选择图形设备

c++ - 如何在 Microsoft Visual C++.2010 Express 中链接 Lua?

c++ - 在 Access 文件中搜索和匹配数据