EvtSubscribe Pull Vs Push Model

时间:2011-08-22 10:34:11

标签: 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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

同意让·戴维

Pull方法将帮助您更轻松地处理多线程,因为基本上主线程将能够处理所有事情。更简单。