2011-08-22 4 views
0

J'essaie d'utiliser api suivant de windows.EvtSubscribe Pull Vs Push Modèle

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 subscriptionPULL et PUSH

Il existe deux modèles d'abonnement: le modèle de traction et le modèle push. Dans le modèle push, vous implémentez un rappel d'abonnement et définissez le paramètre Callback sur votre implémentation. Le service appellera votre rappel pour chaque événement qui correspond à vos critères de requête (ou si une erreur se produit).

Dans le modèle d'extraction, vous créez un objet d'événement que le service signale. Lorsque signalé, vous appelez la fonction EvtNext en utilisant la poignée d'abonnement pour énumérer les événements. Vous devez appeler la fonction EvtClose sur chaque événement que vous énumérez. Vous réinitialisez ensuite l'objet et attendez que le service signale à nouveau. Ce processus se répète jusqu'à ce que vous annuliez l'abonnement.

Je veux savoir quel modèle sera évolutif. et quels sont les avantages et les inconvénients de choisir un modèle plutôt qu'un autre.

Répondre

0

La fonction de rappel est appelée depuis un autre thread, donc vous devrez peut-être synchroniser, et si vous devez synchroniser cela sera plus facile avec le modèle pull ... Et si synchroniser il sera plus facile de fermer l'abonnement avec Event, Comme vous pouvez attendre sur deux événements, celui d'EvtSubscribe et celui à fermer ... Je perds quelques heures à comprendre pourquoi mon appel à EvtClose se bloque avec le modèle de rappel!