問題タブ [getoverlappedresult]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
432 参照

c++ - ReadDirectoryChangesW は、単一のイベントのみを FILE_NOTIFY_INFORMATION バッファーに配置します

ReadDirectoryChangesWイベントが欠落し続けるという問題があります。

私は多くのグーグル検索を行い、次の関数の引数は私の検索によると正しいようですが、誰も確実に知りません. こんな感じで見始めます。

_ovl.hEvent以上で、ご利用お待ちしておりWaitForMultipleObjectsます。監視スレッドに終了を指示するイベントも常にあるため、複数のオブジェクトを使用します。

ovl.hEventが通知された場合、私はこれを行います:

この時点で、常に 0 であるとは限らないことに注意してください。ファイルの名前を変更すると、新しいファイル名用と古いファイル名用のinfo->NextEntryOffset2 つのエントリが正しく取得されます。_resultData

イベントごとに複数のファイルが変更されることは決してありません。これは問題です。コード全体は次のようになります (疑似コード)

これで、配列を処理するReadDirectoryChangesW にリクエストを再開したことがわかります。MyFileInfoStructしかし問題は、2 つ以上のファイルがコピーされた場合、前のファイルを処理している間に 2 番目のファイルがイベントによって登録されますが、最後の変更を「取得」してイベントを再開するまで、後続の変更は無視されます。

2 番目のスレッドで FILE_CHANGES部分からすべての情報を処理することで、これを部分的に解決できます。ただし、開始リクエスト全体を作成することで、イベントを見逃す可能性を減らすだけです->待機->ピックアップ->イベントルーチンの再起動を少し高速にします。ReadDirectoryChangesW実際には 100% のカバレッジを提供するわけではありません。リクエストが保留されていない瞬間がまだあります。

私はインターネットで多くのことを読んでいて、2つの解決策が頻繁に言及されていることを発見しました:

  • ファイルの変更を処理するために別のスレッドを使用します(私はすでにそれを行いました)
  • のサイズを大きくしFILE_NOTIFY_INFORMATION[]ます。これは私にはうまくいきません.Windowsはそこに1つのイベントしか入れません

したがって、問題は次のとおりです。呼び出して結果を「取得」するまで、ファイルの変更を取得してバッファReadDirectoryChangesWGetOverlappedResult追加し続けるにはどうすればよいですか? これは可能ですか?複数の結果を1つのバッファに入れることができた人はいますか?FILE_NOTIFY_INFORMATION[]GetOverlappedResult