Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Policy SDK contém uma classe de observador. Sobrepor membros do observador virtual para gerir callbacks para operações assíncronas.
Quando uma operação assíncrona é concluída, o SDK chama a OnXxx() função membro que corresponde ao resultado. Exemplos são OnLoadSuccess(), OnLoadFailure(), e OnAddEngineSuccess() para mip::PolicyProfile::Observer.
Os exemplos seguintes demonstram o padrão promessa/futuro. Os exemplos do SDK também usam este padrão, e pode estendê-lo para implementar o comportamento desejado de callback.
Implementação do observador de perfil
O exemplo seguinte cria uma classe, ProfileObserver, que deriva de mip::PolicyProfile::Observer. As funções-membro redefinem a classe base para utilizar o padrão future/promise usado ao longo dos exemplos.
Note
Os exemplos seguintes implementam apenas parte da classe observador e não incluem sobrescrições para os mip::PolicyEngine observadores relacionados.
profile_observer.h
O cabeçalho define ProfileObserver, deriva-o de mip::PolicyProfile::Observer e, em seguida, redefine cada uma das funções-membro.
class ProfileObserver final : public mip::PolicyProfile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& 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
A implementação define uma ação a realizar para cada função membro do observador.
Cada membro aceita dois parâmetros. O primeiro é um ponteiro partilhado para a classe que a função gere.
ProfileObserver::OnLoadSuccess espera receber um mip::PolicyProfile.
ProfileObserver::OnAddEngineSuccess espera mip::PolicyEngine.
O segundo é um ponteiro partilhado para o contexto. Nesta implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função converte este valor em std::promise, e depois armazena-o num objeto chamado promise.
Finalmente, o código prepara o futuro ao definir promise->set_value() e passar o mip::PolicyProfile objeto.
#include "profile_observer.h"
#include <future>
//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::PolicyProfile>>>(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::PolicyProfile>>>(context);
promise->set_exception(error);
}
//TODO: Implement remaining observer members
Quando realizar qualquer operação assíncrona, passe a implementação do observador para o construtor de definições ou para a própria função assíncrona.
Passos seguintes
- Explore o exemplo do MIP Policy SDK em C++ no GitHub.