【问题标题】:What is "a wait on a notification handle" in the Windows API?什么是 Windows API 中的“等待通知句柄”?
【发布时间】:2017-07-02 09:35:51
【问题描述】:

我试图弄清楚如何使用 FindFirstChangeNotification 来进行一些文件监控(在这种情况下,用于热重载设置)。我对这个函数返回的内容有点困惑。从文档中,它创建了一个“更改通知句柄”。好的。但是随后“当...时等待通知句柄成功”。在这种情况下,什么是“等待”?

【问题讨论】:

  • 参见 WaitForSingleObject 和 WaitForMultipleObjects。 wait 正是它听起来的样子;等待发生更改的通知。

标签: winapi


【解决方案1】:

在这个上下文中,“等待”是指等待“更改通知句柄”,这是一种HANDLE,您可以使用@等到它处于信号状态 987654321@。

一个最小的例子是这样的:

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,它会一直呆在那里,直到句柄发出信号。当句柄发出信号时,就意味着发生了什么事;目录中的文件已更改或诸如此类。

【讨论】:

    【解决方案2】:

    来自 MSDN 上的Wait Functions

    等待函数允许线程阻塞自己的执行。在满足指定条件之前,等待函数不会返回。

    大多数等待函数(值得注意的例外是 WaitOnAddress)接受一个或多个句柄,这些句柄确定从等待返回的标准。等待句柄意味着将句柄传递给这些等待函数之一。等待对象也很常见,这与等待该对象的句柄具有相同的含义。

    Synchronization Objects 列出了您可以等待的各种对象:事件、互斥体、信号量和可等待计时器;更改和内存资源通知;作业、进程和线程;和(有一些注意事项)I/O 句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多