Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Princip-SDK:et innehåller en observatörsklass. Observer-medlemmarna är virtuella och bör omdefinieras för att hantera återanrop vid asynkrona operationer.
När en asynkron åtgärd slutförs anropas medlemsfunktionen OnXxx() som motsvarar resultatet. Exempel är OnLoadSuccess(), OnLoadFailure()och OnAddEngineSuccess() för mip::Profile::Observer.
Exemplen nedan visar promise/future-mönstret, som också används av SDK-exemplen, och kan utökas för att implementera önskat återanropsbeteende.
Implementering av profilobservatör
I följande exempel har vi skapat en klass som ProfileObserver härleds från mip::Profile::Observer. Medlemsfunktionerna har åsidosatts för att använda det framtids-/löftesmönster som används i exemplen.
Obs! Exemplen nedan är endast delvis implementerade och inkluderar inte åsidosättningar för de relaterade observatörerna mip::ProfileEngine .
profile_observer.h
I sidhuvudet definierar vi ProfileObserver, som härleds från mip::Profile::Observer, och åsidosätter sedan var och en av medlemsfunktionerna.
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
I själva implementeringen definierar vi en åtgärd som ska vidtas för varje observatörsmedlemsfunktion.
Varje medlem accepterar två parametrar. Den första är en delad pekare till klassen som hanteras av funktionen.
ProfileObserver::OnLoadSuccess skulle förvänta sig att få en mip::Profile.
ProfileObserver::OnAddEngineSuccess förväntar sig mip::ProfileEngine.
Den andra är en delad pekare till kontexten. I vår implementering är kontexten en referens till en std::promise, som skickas in som shared_ptr<void>. Den första raden i funktionen omvandlar detta till std::promiseoch lagras sedan i ett objekt med namnet promise.
Slutligen är framtiden klar genom att ange promise->set_value() och skicka objektet 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
När du utför en asynkron åtgärd skickas observatörsimplementeringen till själva inställningskonstruktorn eller asynkrona funktionen.