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. Příklady jsou OnLoadSuccess(), OnLoadFailure()a OnAddEngineSuccess() pro 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.
Každý člen přijímá dva parametry. 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.