3

我有一个 Win32 事件句柄数组,我正在等待使用 WaitForMultipleObjects()。这将返回触发的事件数组中的索引,但我需要知道的是事件的名称。我一直在浏览 MSDN,但看不到任何可以做到这一点的东西。

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

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

4

3 回答 3

1

您可能可以使用未记录的 NT 东西来做到这一点,也许NtQueryObject(handle,ObjectNameInformation,....)

于 2009-10-15T14:27:47.093 回答
0

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

于 2009-10-14T13:34:43.773 回答
0

通常,事件的名称用于调用 OpenEvent() 以获取句柄。这样,您无需在运行时传递句柄,而是确定事件名称的命名约定。

我可以想到三种方法来做到这一点:

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

您是否根据事件的名称来决定要采取的行动?一个“if else if”语句,逐个检查句柄的名称以确定要采取的操作?这种情况通常使我认为继承是一种潜在的解决方案。忍受我一会儿。

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

现在你需要一个容器,所以你可以说 actionlist->GetEventAction(handle)->go_go_commandos()。

那有帮助吗?

于 2009-10-14T13:52:23.553 回答