是否可以调用WriteFile,应用程序将永远等待回调?

时间:2012-04-23 11:08:17

标签: c++ winapi visual-c++

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

WaitForSingleObject( handle, INFINITE )

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

是否有可能有一些场景让我永远等待...... WriteFile不会完成他的写作?我要写512 kB,我假设我的硬件没有问题。

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

2 个答案:

答案 0 :(得分:1)

这不应该发生,但它与一些“不太理想”的驱动程序一致。无论如何,网络操作在返回之前可能需要很长时间,所以我建议你应用一个很长的超时,可能是2分钟,(1000 * 60 * 2),如果超时,关闭/重新打开并重试writeFile()。

答案 1 :(得分:1)

当您进行重叠的I / O调用时,您会将责任委派给驱动程序,以确保及时完成。如果驱动程序有错误或硬件功能失常,那么没有什么是合理的,当这种低级操作失败时,没有程序可以继续以有用的方式运行。

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

这一切都没有意义,您需要来自操作系统的最低服务保证。你也可以在没有OVERLAPPED的情况下调用WriteFile()。同样的错误驱动程序现在将挂起您的程序。就像CancelIo()不会挂起一样。哪个没关系,是驱动程序有问题,而不是你。这并不是说用户不会注意到机器出现严重问题,其他程序也会受到这种不幸事故的影响。

不要编写处理极不可能的角落案例的代码。最重要的是,不要编写无法有效测试的代码。