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_;