Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O SDK de Política contém uma classe de observador. Os membros observadores são virtuais e devem ser substituídos para manipular retornos de chamada nas operações assíncronas.
Quando uma operação assíncrona é concluída, a OnXxx() função membro correspondente ao resultado é chamada. Exemplos são OnLoadSuccess(), OnLoadFailure()e OnAddEngineSuccess() para mip::Profile::Observer.
Os exemplos a seguir demonstram o padrão de promise/future, que também é utilizado nos exemplos do SDK e pode ser adaptado para implementar o comportamento desejado de callbacks.
Implementação do observador de perfil
No exemplo a seguir, criamos uma classe derivada ProfileObserver de mip::Profile::Observer. As funções de membro foram substituídas para usar o padrão futuro/promessa usado em todos os exemplos.
Observação: os exemplos abaixo são implementados parcialmente e não incluem substituições para os mip::ProfileEngine observadores relacionados.
profile_observer.h
No cabeçalho, definimos ProfileObserver, derivando de mip::Profile::Observer e, em seguida, substituímos cada uma das funções de membro.
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
Na própria implementação, definimos uma ação a ser tomada para cada função de membro do observador.
Cada membro aceita dois parâmetros. O primeiro é um ponteiro compartilhado para a classe manipulada pela função. ProfileObserver::OnLoadSuccess esperaria receber um arquivo mip::Profile. ProfileObserver::OnAddEngineSuccess esperaria mip::ProfileEngine.
O segundo é um ponteiro compartilhado para o contexto. Em nossa implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função converte isso em std::promise e, em seguida, armazena em um objeto chamado promise.
Finalmente, o futuro é preparado pela configuração de promise->set_value() e a transmissão do objeto 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
Ao executar qualquer operação assíncrona, a implementação do observador é passada para o construtor de configurações ou a função assíncrona em si.