代码之家  ›  专栏  ›  技术社区  ›  user1333

如何从句柄中获取事件名称

  •  2
  • user1333  · 技术社区  · 16 年前

    我有一个使用WaitForMultipleObjects()等待的Win32事件句柄数组。这将返回触发事件数组中的索引,但我需要知道的是事件的名称。我一直在查看msdn,找不到任何相关信息。

    基本上,我有一个类,它在定义的一段时间内,通过使用regnotifyChangeKeyValue()的事件来监视注册表,但在它开始之前,其他类在那里注册对键和值感兴趣的项和值。然后我在一个单独的线程上等待,并报告修改过的键的名称。事件名称是事件的关键所在,直到运行时我才知道其中有多少个或将调用什么。我不想为每个键创建一个线程,因为它的性能不是很好。

    有人知道如何获取事件名称或更好的方法吗?

    3 回复  |  直到 16 年前
        1
  •  0
  •   Len Holgate    16 年前

    就我个人而言,我不会那样做。创建自己的映射(std::map?)在事件和键名称之间,然后在发出事件信号时进行自己的查找。

        2
  •  1
  •   Anders    16 年前

    也许你可以用非官方的NT材料来做。 NtQueryObject(handle,ObjectNameInformation,....)

        3
  •  0
  •   Kieveli    16 年前

    通常,事件的名称用于调用openevent()以获取句柄。通过这种方式,您不需要在运行时与句柄通信,而是确定事件名称的命名约定。

    我可以想出三种方法:

    • 循环所有硬编码事件名并调用OpenEvent()。
    • 将句柄和名称保存在std::map中
    • 创建一个类来存储句柄和名称(可能在std::map中),并编写方法来快速从句柄中获取名称。

    您是否根据活动名称决定采取什么行动?一个“if else if”语句,它逐个检查句柄的名称以确定要采取什么操作?这种情况通常会让我把继承看作一种潜在的解决方案。请容忍一下。

    如果创建一个基类,比如说EventAction。它有一个事件句柄和一个虚拟成员函数go_go_commandos()。您从中派生出每个要执行操作的“事件”,并在每个派生类的go-go-commandos()方法中实现该操作。

    现在您需要的是一个容器,这样您就可以说actionList->getEventAction(handle)->go_commandos()。

    那有帮助吗?