我正在尝试从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
有两种订阅模式:拉模型和推模型。在推送模型中,您实现订阅回调并将Callback参数设置为您的实现。该服务将针对符合您的查询条件的每个事件调用您的回调(或者如果发生错误)。
在拉模型中,您可以创建服务信号的事件对象。发出信号时,使用订阅句柄调用EvtNext函数来枚举事件。您必须在枚举的每个事件上调用EvtClose函数。然后重置对象并等待服务再次发出信号。在您取消订阅之前,此过程将重复进行。
我想知道哪种型号可扩展。选择一种模式而不是另一种模式的优缺点是什么。
答案 0 :(得分:0)
从另一个线程调用回调函数,因此您可能需要进行同步,如果必须同步它,使用拉模型会更容易...如果同步它将更容易使用事件关闭订阅,如你可以等待两个事件,一个来自EvtSubscribe,另一个要关闭...... 我浪费了几个小时来理解为什么我对EvtClose的调用与回调模型挂起了!
答案 1 :(得分:0)
同意让·戴维
Pull方法将帮助您更轻松地处理多线程,因为基本上主线程将能够处理所有事情。更简单。