Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Sada Policy SDK obsahuje jednu třídu pozorovatele. Členové pozorovatele jsou virtuální a měly by být přepsány, aby zpracovávaly zpětná volání pro asynchronní operace.
Po dokončení asynchronní operace je volána členská funkce OnXxx(), která odpovídá výsledku. Examples are OnLoadSuccess(), OnLoadFailure(), and OnAddEngineSuccess() for mip::Profile::Observer.
Níže uvedené příklady demonstrují vzor slib/budoucnost, který je také používán vzorky SDK, a může být rozšířen k implementaci požadovaného chování zpětného volání.
Implementace monitoru profilu
V následujícím příkladu jsme vytvořili třídu, ProfileObserver, která je odvozena od mip::Profile::Observer. Členské funkce byly přepsány tak, aby používaly vzor future/promise použitý v celých příkladech.
Poznámka: Následující ukázky jsou implementovány pouze částečně a nezahrnují přepsání pro mip::ProfileEngine související pozorovatele.
profile_observer.h
V hlavičce definujeme ProfileObserver, odvozenou z mip::Profile::Observer, a poté přepíšeme každou z členských funkcí.
class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement remaining members
};
profile_observer.cpp
V samotné implementaci definujeme akci, která se má provést pro každou členovou funkci pozorovatele.
Each member accepts two parameters. První je sdílený ukazatel na třídu, kterou zpracovává funkce.
ProfileObserver::OnLoadSuccess očekává, že obdrží mip::Profile.
ProfileObserver::OnAddEngineSuccess by očekával mip::ProfileEngine.
Druhý je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na std::promise, předaným jako shared_ptr<void>. První řádek funkce převede toto na std::promise, poté je uložen do objektu nazvaného promise.
Nakonec se připraví budoucnost nastavením promise->set_value() a předáním objektu mip::Profile.
#include "profile_observer.h"
#include <future>
//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
promise->set_exception(error);
}
//TODO: Implement remaining observer members
Při provádění jakékoli asynchronní operace se implementace pozorovatele předá konstruktoru nastavení nebo samotné asynchronní funkci.