c++ - EvtSubscribe 拉与推模型

标签 c++ c windows winapi event-log

我正在尝试使用来自 Windows 的以下 api。

EVT_HANDLE WINAPI EvtSubscribe(
  __in  EVT_HANDLE Session,
  __in  HANDLE SignalEvent,
  __in  LPCWSTR ChannelPath,
  __in  LPCWSTR Query,
  __in  EVT_HANDLE Bookmark,
  __in  PVOID context,
  __in  EVT_SUBSCRIBE_CALLBACK Callback,
  __in  DWORD Flags
);

This api supports two models for subscription PULLPUSH

有两种订阅模式:拉模式和推模式。在推送模型中,您实现订阅回调并将回调参数设置为您的实现。该服务将为每个符合您的查询条件的事件调用您的回调(或者如果发生错误)。

在拉模型中,您创建一个事件对象,该对象由服务发出信号。收到信号后,您可以使用订阅句柄调用 EvtNext 函数来枚举事件。您必须对枚举的每个事件调用 EvtClose 函数。然后您重置对象并等待服务再次发出信号。重复此过程,直到您取消订阅。

我想知道哪种模型可以扩展。选择一种模型而不是另一种模型的优缺点是什么。

最佳答案

回调函数是从另一个线程调用的,所以你可能必须同步,如果你必须同步,那么拉模型会更容易......如果同步,关闭事件订阅会更容易,因为您可能会等待两个事件,一个来自 EvtSubscribe,另一个要关闭...... 我花了几个小时来理解为什么我对 EvtClose 的调用因回调模型而挂起!

关于c++ - EvtSubscribe 拉与推模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146191/

相关文章:

c++ - 如何更改在 Windows 中加载服务的顺序?

c++ - Qt4 : Decorating a QLineEdit (painting around it)

c - 就地修改数组并了解其内存分配

c - C 中的输出到输入

c - C 的二分 - 初学者的基本 q

域组的 Oracle 的 Windows 身份验证

c# - 使用 P/Invoked GlobalSize 时堆已损坏

c++ - 如何序列化GMP mpf类型?

c++ - 如何像资源管理器一样在 ListView 中显示缩略图?

c++ - 非托管 C++ COM 和托管 C++ .NET4 互操作