2

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

WaitForSingleObject( handle, INFINITE )

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

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

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

4

2 回答 2

1

这不应该发生,但它显然与一些“不是最佳”的驱动程序有关。无论如何,网络操作可能需要很长时间才能返回,所以我建议您应用较长的超时时间,可能是 2 分钟(1000*60*2),如果超时,请关闭/重新打开并重试 writeFile()。

于 2012-04-23T11:22:25.043 回答
1

当您进行重叠的 I/O 调用时,您将责任委托给驱动程序,以确保其及时完成。如果驱动程序有错误或硬件功能失调,您可以做任何合理的事情,当此类低级操作失败时,任何程序都无法继续以有用的方式运行。

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

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

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

于 2012-04-23T12:57:38.373 回答