c ++ - EvtSubscribe Træk Vs Push Model

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge følgende api fra windows.


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
);


Denne api understøtter to modeller til abonnement PULL og PUSH [4]


Der er to abonnementsmodeller: Trækmodellen og push-modellen. I push-modellen implementerer du et abonnement tilbagekald og sæt parameteren Tilbagekald til din implementering. Tjenesten kalder din tilbagekald for hver begivenhed, der matcher dine forespørgsels kriterier (eller hvis der opstår en fejl).


I pull-modellen opretter du et hændelsesobjekt, som servicesignalerne. Når du signalerer, kalder du EvtNext-funktionen med abonnementshåndtaget for at optælle begivenhederne. Du skal ringe EvtClose-funktionen på hver begivenhed, som du opregner. Du nulstiller derefter objektet og venter på, at tjenesten igen signaliseres. Denne proces gentages, indtil du annullerer abonnementet.


Jeg vil gerne vide, hvilken model der skal skaleres. og hvad er fordelene ved at vælge en model over en anden.

Bedste reference


Tilbagekaldelsesfunktionen kaldes fra en anden tråd, så du bliver muligvis synkroniseret, og hvis du skal synkronisere, bliver det lettere med pull-modellen ... Og hvis du synkroniserer, bliver det lettere at lukke abonnementet med Event, som du måske venter på to begivenheder, den ene fra EvtSubscribe og den ene til at lukke ...
Jeg spilder nogle timer for at forstå, hvorfor mit opkald til EvtClose hænger med tilbagekaldelsesmodellen!