Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le Kit de développement logiciel (SDK) File contient deux classes d’observateur. Vous pouvez remplacer les membres d’observateurs virtuels pour gérer les rappels d’événements.
Lorsqu’une opération asynchrone se termine, le SDK appelle la OnXxx() fonction membre qui correspond au résultat. Voici des exemples : OnLoadSuccess(), OnLoadFailure()et OnAddEngineSuccess() pour mip::FileProfile::Observer.
Ces exemples illustrent le modèle promesse/futur. Les exemples du Kit de développement logiciel (SDK) utilisent également ce modèle et vous pouvez l’étendre pour implémenter le comportement de rappel souhaité.
Implémentation de l’observateur de profil de fichier
L’exemple suivant crée une classe, ProfileObserverqui dérive de mip::FileProfile::Observer. Les fonctions membres remplacent la classe de base pour utiliser le modèle futur/promesse utilisé dans les exemples.
Note
Les exemples implémentent uniquement une partie de la classe observateur et n’incluent pas de remplacements pour les mip::FileEngine observateurs associés.
profile_observer.h
Le fichier d’en-tête définit ProfileObserver, le fait dériver de mip::FileProfile::Observer, puis redéfinit chacune des fonctions membres.
class ProfileObserver final : public mip::FileProfile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement mip::FileEngine related observers.
};
profile_observer.cpp
L’implémentation définit une action à entreprendre pour chaque fonction membre d’observateur.
Chaque membre accepte deux paramètres. Le premier est un pointeur partagé vers la classe gérée par la fonction.
ProfileObserver::OnLoadSuccess s’attend à recevoir un mip::FileProfile.
ProfileObserver::OnAddEngineSuccess attend mip::FileEngine.
Le deuxième est un pointeur partagé vers le contexte. Dans cette implémentation, le contexte est une référence à un std::promise, transmise par référence sous la forme de std::shared_ptr<void>. La première ligne de la fonction convertit cette valeur std::promiseen , puis la stocke dans un objet appelé promise.
Enfin, le code prépare l’avenir en définissant promise->set_value() et en transmettant l’objet mip::FileProfile .
#include "profile_observer.h"
#include <future>
//Called when FileProfile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise =
std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileProfile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when FileProfile 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::FileProfile>>>(context);
promise->set_exception(error);
}
//TODO: Implement mip::FileEngine related observers.
Lorsque vous instanciez une classe sdk ou utilisez une fonction qui effectue des opérations asynchrones, transmettez l’implémentation de l’observateur au constructeur de paramètres ou à la fonction asynchrone elle-même. Lorsque vous instanciez l’objet mip::FileProfile::Settings , le constructeur accepte mip::FileProfile::Observer l’un des paramètres. Cet exemple montre l’élément personnalisé ProfileObserver, utilisé dans un constructeur mip::FileProfile::Settings.
Implémentation de l’observateur FileHandler
Similaire à l’observateur de profil, mip::FileHandler implémente une mip::FileHandler::Observer classe pour gérer les notifications d’événements asynchrones pendant les opérations de fichier. L’implémentation est similaire à l’implémentation précédente. L’exemple suivant définit FileHandlerObserverpartiellement .
file_handler_observer.h
#include "mip/file/file_handler.h"
class FileHandlerObserver final : public mip::FileHandler::Observer {
public:
void OnCreateFileHandlerSuccess(
const std::shared_ptr<mip::FileHandler>& fileHandler,
const std::shared_ptr<void>& context) override;
void OnCreateFileHandlerFailure(
const std::exception_ptr& error,
const std::shared_ptr<void>& context) override;
//TODO: override remaining member functions inherited from mip::FileHandler::Observer
};
file_handler_observer.cpp
Cet exemple inclut uniquement les deux premières fonctions, mais les fonctions restantes utilisent un modèle similaire à ces fonctions et à ProfileObserver.
#include "file_handler_observer.h"
void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_value(fileHandler);
}
void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_exception(error);
}
//TODO: override remaining member functions inherited from mip::FileHandler::Observer
Étapes suivantes
- Explorez l’exemple C++ du Kit de développement logiciel (SDK) de fichier MIP sur GitHub.