2017-07-02 35 views
1

我想弄清楚如何使用FindFirstChangeNotification爲了做一些文件監視(在這種情況下,熱重新加載設置)。我對這個函數返回的內容感到困惑。從文檔中,它創建了「更改通知句柄」。可以,當然。但是,然後「等待......時通知句柄成功」。在這種情況下,什麼是「等待」?什麼是Windows API中的「等待通知句柄」?

+1

請參閱WaitForSingleObject和WaitForMultipleObjects。 A * wait *正是它聽起來的樣子;等待發生變化的通知。 –

回答

1

在此背景下,「等待」是指等待「變更通知處理」,這是一種HANDLE可以等待,直到它在信號狀態使用Wait Functions

的最小的例子是這樣的:

static void MyNotifyDirChange(HWND hwnd, LPCWSTR szPath) 
{ 
    HANDLE hWaitNotify = ::FindFirstChangeNotificationW(
     szPath, TRUE, 
     FILE_NOTIFY_CHANGE_FILE_NAME | 
     FILE_NOTIFY_CHANGE_DIR_NAME | 
     FILE_NOTIFY_CHANGE_ATTRIBUTES | 
     FILE_NOTIFY_CHANGE_SIZE | 
     FILE_NOTIFY_CHANGE_LAST_WRITE | 
     FILE_NOTIFY_CHANGE_LAST_ACCESS | 
     FILE_NOTIFY_CHANGE_CREATION | 
     FILE_NOTIFY_CHANGE_SECURITY); 
    if (hWaitNotify == INVALID_HANDLE_VALUE) 
    { 
     ::MessageBoxW(hwnd, 
      L"FindFirstChangeNotificationW failed.", 
      nullptr, MB_ICONERROR); 
     return; 
    } 
    ::WaitForSingleObject(hWaitNotify, INFINITE); 
    ::MessageBoxW(hwnd, L"Dir change notify.", 
     L"Notify", MB_ICONINFORMATION); 
} 

WaitForSingleObject等待直到指定的對象是在信號狀態或超時間隔過去。因爲我已經指定了INFINITE,它將永遠留在那裏,直到句柄變成信號。當手柄變成信號時,意味着發生了一些事情;目錄中的文件已經改變或者沒有改變。

0

Wait Functions MSDN上:

等待功能允許一個線程阻塞自己的執行。等待函數不會返回,直到滿足指定的條件。

大部分等待函數(顯着的例外是WaitOnAddress)接受一個或多個句柄,這些句柄決定了從等待中返回的條件。等待句柄意味着將句柄傳遞給這些等待函數之一。通常指的是等待一個對象,這個對象的含義與等待該對象的句柄的含義相同。

Synchronization Objects列出了您可以等待的各種對象:事件,互斥量,信號量和等待定時器;更改和內存資源通知;工作,流程和線程;和(受到一些警告)I/O句柄。