Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пакет SDK политики содержит один класс наблюдателя. Переопределите элементы виртуального наблюдателя для обработки обратных вызовов для асинхронных операций.
После завершения асинхронной операции SDK вызывает функцию-член OnXxx(), соответствующую полученному результату. Примеры: OnLoadSuccess(), OnLoadFailure()и OnAddEngineSuccess() для mip::Profile::Observer.
В следующих примерах демонстрируется шаблон обещания и будущего. Примеры пакета SDK также используют этот шаблон, и его можно расширить для реализации требуемого поведения обратного вызова.
Реализация наблюдателя профиля
В следующем примере создается класс, ProfileObserverпроизводный от mip::Profile::Observer. Функции-члены переопределяют методы базового класса, чтобы использовать паттерн future/promise, который используется во всех примерах.
Note
Следующие примеры реализуют только часть класса наблюдателя и не включают переопределения для связанных наблюдателей mip::ProfileEngine .
profile_observer.h
Заголовок определяет ProfileObserver, наследует его от mip::Profile::Observer, а затем переопределяет каждую из функций-членов.
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
Реализация определяет, какое действие следует выполнить для каждой функции-члена наблюдателя.
Каждый член принимает два параметра. Первым является общий указатель на класс, который обрабатывает функция.
ProfileObserver::OnLoadSuccess ожидает получить mip::Profile.
ProfileObserver::OnAddEngineSuccess ожидает mip::ProfileEngine.
Второй — это общий указатель на контекст. В этой реализации контекст является ссылкой на объект std::promise, переданный как shared_ptr<void>. Первая строка функции вызывает это значение std::promise, а затем сохраняет его в объекте с именем promise.
Наконец, код делает будущее готовым, задав promise->set_value() и передав объект 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
При выполнении любой асинхронной операции передайте реализацию наблюдателя конструктору параметров или асинхронной функции.
Дальнейшие действия
- Ознакомьтесь с примером пакета SDK политики MIP для C++ на GitHub.