我正试图写一些东西来取代同步
WriteFile
+
CancelSynchronousIo
将Windows XP支持添加到程序中。我选择了异步
WriteFileEx
+
CancelIo
,那就更难满足了。我写了一个小程序来测试行为(
full code
).
经过一些测试,我不明白发生了什么:
2024-04-24 17:22:26: WriteFile start
2024-04-24 17:22:26: Starting concurrent thread.
2024-04-24 17:22:26: Exiting concurrent thread.
2024-04-24 17:22:26: WriteFile result 1, LastError() = 0
2024-04-24 17:22:26: Wait start
2024-04-24 17:22:26: Second event was signaled.
2024-04-24 17:22:51: Cancel result 1, LastError() = 0
2024-04-24 17:22:51: Wait end
它需要25秒的写入时间,并且当我设置它时不会对取消事件做出反应。为什么?或者有时整个事件设置得更快(
WaitForMultipleObject
返回代码),并且通常没有关于超时的消息,但它应该每100毫秒出现一次。
我的代码打开一个文件并启动异步写入操作:
const HANDLE hFile = CreateFile(path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
const BOOL result = ::WriteFileEx(m_file.get(), buffer, bytesToWrite, &m_ov, FileIOCompletion);
之后,它开始等待完整的事件:
dwEvent = WaitForMultipleObjectsEx(1, waitObjects.data(), FALSE, 1000, FALSE);
我用过
FileIOCompletion
从设置完整事件
OVERLAPPED
(表现得像
蓝色代码
).
有时我会看到超时消息,我认为它的行为与预期的一样,但它是如此的不可预测,以至于我无法理解。
这个代码正确与否?