ReadFileMany
のインターフェイスを模倣し、読み取り対象の (オフセット、長さ) ペアのリストReadFile
が与えられ、ファイルのすべての部分を非同期的に読み取る関数を作成しようとしています。
ファイルの次の部分などを読み取るために再度呼び出すことができるように、I/O が完了するまで待機するようにスレッド プール スレッドを指示するためにReadFileMany
使用することで、内部でこれを行っています。RegisterWaitForSingleObject
ReadFile
私が直面している問題は、 の特定の動作を模倣できないように見えることですReadFile
。
具体的には、イベント ハンドルを必要とせずに、ファイルハンドル自体をイベントのように使用できます。
OVERLAPPED ov = {0};
DWORD nw;
if (ReadFile(hFile, buf, buf_size, &nw, &ov))
{
if (WaitForSingleObject(hFile, INFINITE) == WAIT_OBJECT_0)
{
...
}
}
しかしもちろん、ユーザーがファイル ハンドルを待機している場合、最終的な読み取りではなく、中間読み取りが完了したという通知を受け取る可能性があります。
そのため、 の内部では、最後の部分を除くすべてのにパラメータをReadFileMany
渡すしかありません。 hEvent
ReadFile
問題は、すべての部分が読み取られたときにファイルハンドルがシグナル状態になるのをユーザーが待機できるようにする方法はありますか?
最初は答えが明白に思えます:最後の部分を読むときにイベント ハンドルを渡すのは避けてください!
読み取りが成功する場合は正常に機能しますが、エラーがある場合は機能しません。ReadFile
が最後の読み取りで突然エラーを返し始めた場合は、ファイル ハンドルをシグナル状態に手動で設定して、リーダーが への潜在的な呼び出しから復帰できるようにする必要がありますWaitForSingleObject(hFile)
。
しかし、実際の I/O を実行せずにファイル ハンドルをシグナル状態に設定する方法はないようですReadFile
。外、またはそれを正しく行うことは不可能ですか?