Mercurial > hg > orthanc-stone
diff Samples/Sdl/FusionMprSdl.h @ 828:28f99af358fa
Merge + FusionMprSdl
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 29 May 2019 16:15:04 +0200 |
parents | 2fd96a637a59 |
children | e3c56d4f863f |
line wrap: on
line diff
--- a/Samples/Sdl/FusionMprSdl.h Wed May 29 13:44:55 2019 +0200 +++ b/Samples/Sdl/FusionMprSdl.h Wed May 29 16:15:04 2019 +0200 @@ -19,12 +19,17 @@ **/ #include "../../Framework/Messages/IObserver.h" +#include "../../Framework/Messages/IMessageEmitter.h" +#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" #include "../../Framework/Scene2DViewport/ViewportController.h" +#include "../../Framework/Volumes/DicomVolumeImage.h" +#include "../../Framework/Oracle/ThreadedOracle.h" #include <boost/enable_shared_from_this.hpp> +#include <boost/thread.hpp> +#include <boost/noncopyable.hpp> + #include <SDL.h> -#include "../../Framework/Volumes/DicomVolumeImage.h" -#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" namespace OrthancStone { @@ -33,8 +38,11 @@ class ILayerStyleConfigurator; class DicomStructureSetLoader; class IOracle; + class ThreadedOracle; class VolumeSceneLayerSource; + class NativeFusionMprApplicationContext; + enum FusionMprGuiTool { FusionMprGuiTool_Rotate = 0, @@ -54,12 +62,18 @@ class Scene2D; + /** + This application subclasses IMessageEmitter to use a mutex before forwarding Oracle messages (that + can be sent from multiple threads) + */ class FusionMprSdlApp : public IObserver , public boost::enable_shared_from_this<FusionMprSdlApp> + , public IMessageEmitter { public: // 12 because. FusionMprSdlApp(MessageBroker& broker); + void PrepareScene(); void Run(); void SetInfoDisplayMessage(std::string key, std::string value); @@ -77,7 +91,31 @@ void OnSceneTransformChanged( const ViewportController::SceneTransformChanged& message); + + virtual void EmitMessage(const IObserver& observer, + const IMessage& message) ORTHANC_OVERRIDE + { + try + { + boost::unique_lock<boost::shared_mutex> lock(mutex_); + oracleObservable_.EmitMessage(observer, message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while emitting a message: " << e.What(); + throw; + } + } + private: +#if 1 + // if threaded (not wasm) + MessageBroker& broker_; + IObservable oracleObservable_; + ThreadedOracle oracle_; + boost::shared_mutex mutex_; // to serialize messages from the ThreadedOracle +#endif + void SelectNextTool(); /** @@ -132,7 +170,7 @@ private: CoordinateSystem3D plane_; - IOracle* oracle_ = nullptr; + boost::shared_ptr<VolumeSceneLayerSource> source1_, source2_, source3_; std::auto_ptr<OpenGLCompositor> compositor_;