Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das File SDK enthält zwei Beobachterklassen. Sie können virtuelle Beobachtermitglieder außer Kraft setzen, um Ereignisrückrufe zu behandeln.
Wenn ein asynchroner Vorgang abgeschlossen ist, ruft das SDK die OnXxx() Memberfunktion auf, die dem Ergebnis entspricht. Beispiele sind OnLoadSuccess(), OnLoadFailure()und OnAddEngineSuccess() für mip::FileProfile::Observer.
Diese Beispiele veranschaulichen das Zusage-/zukünftige Muster. Die SDK-Beispiele verwenden auch dieses Muster, und Sie können es erweitern, um das gewünschte Rückrufverhalten zu implementieren.
Implementierung des Dateiprofilbeobachters
Im folgenden Beispiel wird eine Klasse, ProfileObserver, erstellt, die von mip::FileProfile::Observer abgeleitet ist. Die Memberfunktionen überschreiben die Basisklasse, um das in den Beispielen verwendete Muster "Future/Promise" zu verwenden.
Note
Die Beispiele implementieren nur einen Teil der Beobachterklasse und enthalten keine Überschreibungen für die zu mip::FileEngine gehörenden Beobachter.
profile_observer.h
Die Header-Datei definiert ProfileObserver, leitet es von mip::FileProfile::Observer ab und überschreibt dann jede der Member-Funktionen.
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
Die Implementierung definiert eine Aktion, die für jede Beobachtermitgliedsfunktion zu ergreifen ist.
Jedes Mitglied akzeptiert zwei Parameter. Der erste ist ein Shared Pointer auf die Klasse, die von der Funktion verarbeitet wird.
ProfileObserver::OnLoadSuccess erwartet, ein mip::FileProfile zu erhalten.
ProfileObserver::OnAddEngineSuccess erwartet mip::FileEngine.
Der zweite ist ein gemeinsamer Zeiger auf den Kontext. In dieser Implementierung ist der Kontext eine Referenz auf ein std::promise, das per Referenz als std::shared_ptr<void> übergeben wird. Die erste Zeile der Funktion wandelt diesen Wert in std::promise um und speichert ihn dann in einem Objekt namens promise.
Letztendlich wird durch den Code für die Zukunft gerüstet, indem das promise->set_value()-Objekt festgelegt und mip::FileProfile übergeben wird.
#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.
Wenn Sie eine SDK-Klasse instanziieren oder eine Funktion verwenden, die asynchrone Vorgänge ausführt, übergeben Sie die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst. Wenn Sie das Objekt mip::FileProfile::Settings instanziieren, akzeptiert der Konstruktor mip::FileProfile::Observer als einen der Parameter. Dieses Beispiel zeigt den benutzerdefinierten ProfileObserver, der in einem mip::FileProfile::Settings-Konstruktor verwendet wird.
FileHandler-Beobachterimplementierung
Ähnlich wie der Profilbeobachter mip::FileHandler implementiert eine mip::FileHandler::Observer Klasse zum Behandeln asynchroner Ereignisbenachrichtigungen während Dateivorgängen. Die Implementierung ähnelt der vorherigen Implementierung. Das folgende Beispiel definiert FileHandlerObserver teilweise.
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
Dieses Beispiel enthält nur die ersten beiden Funktionen, aber die verbleibenden Funktionen verwenden ein ähnliches Schema wie diese Funktionen und 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
Nächste Schritte
- Erkunden Sie das MIP File SDK C++-Beispiel für GitHub.