2012-01-11 8 views
2

私は、ファイルを特定のフォルダに変更されたときに知っている次のコードを使用してからReadDirectoryChangesWを停止する方法:ファイルの変更が発生するまで他のスレッド

HANDLE hDir = ::CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL); 

FILE_NOTIFY_INFORMATION returnData[1024]; 
DWORD returnDataSize = 0;     

while(ReadDirectoryChangesW(hDir, returnData, sizeof(returnData), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE, &returnDataSize, NULL, NULL)) 
{ 
    ... 
} 

ReadDirectoryChangesWブロックスレッド。この機能を停止/強制復帰する方法はありますか?

+1

これは、最後の2つの引数が設計されたものです。 –

答えて

2

あなたの説明から、CancelIoExのように聞こえます。明らかに、あなたは今それを同期的に呼び出すので、別のスレッドが必要です。これは呼び出しスレッドをブロックするので、そのスレッドからは何もできず、停止することもできません。

+0

私は他のスレッドでそれを持っていました。ありがとう!できます! – Felics

1

非同期操作モードでこのAPI関数を呼び出す必要があります。他の多くのファイルAPIと同様に、OVERLAPPED構造体をAPI呼び出しに渡すことで、これを実現します。

非同期に操作すると、関数はすぐに戻ります。結果を収集することを選択すると、それはあなた次第です。関数が結果を提供する準備ができているかどうかをテストしたり、APIに結果が利用可能であることを通知したり、保留中のI/Oを取り消したり、結果が得られるまでブロックすることができます。非常に柔軟性があり、当然のことながら非同期モードでAPIを使用する方が複雑です。

MSDNには重複したI/Oに関する多くの情報があります。ここから開始:Synchronization and Overlapped Input and Output

0

ブロッキング呼び出しを別のスレッドから戻す場合は、呼び出しを返すものを変更します。おそらく一時ファイルを作成します。

関連する問題