如何使用WaitForSingleObject发出文件HANDLE信号

时间:2015-12-19 15:59:50

标签: c++ multithreading winapi thread-synchronization overlapped-io

此代码,我无法控制,使用重叠的I / O读取文件:

// Read file asynchronously
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);
BYTE buffer[10];
OVERLAPPED oRead = { 0 };
ReadFile(hFile, buffer, 10, NULL, &oRead);

// Do work while file is being read
...

// Wait for read to finish
WaitForSingleObject(hFile, INFINITE);

// ReadFile has finished 
// buffer now contains data which can be used
...

在另一个线程中(实际上是在ReadFile的API挂钩中),我需要发信号通知hFile取消阻止WaitForSingleObject。通常,Windows(或处理ReadFile的设备驱动程序)执行此操作,但我需要对其进行模拟。

我发现通常不会使用hFile的{​​},ReleaseMutexReleaseSemaphoreSetEvent。它们都返回错误6(句柄无效)。是否有适用于文件,命名管道或通信设备的API?

我知道WaitForSingleObject(hFile)require-dir,但上面的代码是给定的,我需要使用它。谢谢!

1 个答案:

答案 0 :(得分:0)

据我所知,文件句柄的信号发生在Windows内部,即使在内核模式下运行也没有API。 (我相信文件系统驱动程序只是告诉Windows操作已完成,并让Windows弄清楚如何通知用户模式进程。我可能错了。)

一种解决方案是针对句柄发出一个真正的ReadFile(零字节读取可能就足够了),以便发出信号。

但是挂钩WaitForSingleObject可能更明智,检查是否在有问题的文件句柄上调用它,如果是,则根据需要修改行为。