我正在尝试使用来自 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 PULL
和 PUSH
有两种订阅模式:拉模式和推模式。在推送模型中,您实现订阅回调并将回调参数设置为您的实现。该服务将为每个符合您的查询条件的事件调用您的回调(或者如果发生错误)。
在拉模型中,您创建一个事件对象,该对象由服务发出信号。收到信号后,您可以使用订阅句柄调用 EvtNext 函数来枚举事件。您必须对枚举的每个事件调用 EvtClose 函数。然后您重置对象并等待服务再次发出信号。重复此过程,直到您取消订阅。
我想知道哪种模型可以扩展。选择一种模型而不是另一种模型的优缺点是什么。
最佳答案
回调函数是从另一个线程调用的,所以你可能必须同步,如果你必须同步,那么拉模型会更容易......如果同步,关闭事件订阅会更容易,因为您可能会等待两个事件,一个来自 EvtSubscribe,另一个要关闭...... 我花了几个小时来理解为什么我对 EvtClose 的调用因回调模型而挂起!
关于c++ - EvtSubscribe 拉与推模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146191/