]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOMultiThreadImageReader.cpp
#3218 creaImageIO Feature New Normal - vtk8itk4wx3-mingw64
[creaImageIO.git] / src / creaImageIOMultiThreadImageReader.cpp
index 96ba90b4a03afcbc9c8822e01a39339c5caa92a3..e7b023bba7e2ddc75e78d998e4f045036ca6c409 100644 (file)
@@ -31,6 +31,9 @@
 #include <wx/utils.h>
 #include <creaImageIOSystem.h>
 
+       #include <creaImageIODicomImageReader.h>
+
+
 #include <creaImageIOGimmick.h>
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -45,24 +48,34 @@ namespace creaImageIO
     vtkImageData* image)
   {
     wxMutexLocker lock(mMultiThreadImageReaderUserMutex);
-
     this->OnMultiThreadImageReaderEvent(filename,type,image);
   }
   //=====================================================================
 
+  class wxThreadEED2
+  { 
+  public:
+         void Delete() {  printf("EED wxThreadEED2::Delete() \n"); }
+         int Run() { printf("EED wxThreadEED2::Run() \n"); return 0;}
+         void Pause() { printf("EED wxThreadEED2::Pause() \n"); }
+         void Create() { printf("EED wxThreadEED2::Create() \n"); }
+         bool IsAlive() { printf("EED wxThreadEED2::IsAlive() \n"); return false; }
+         bool TestDestroy() { printf("EED wxThreadEED2::TestDestroy() \n"); return false; }
+         int GetCurrentId() { printf("EED wxThreadEED2::GetCurrentId() \n"); return -999; }      
+  };
+  
   //=====================================================================
-  class ThreadedImageReader: public wxThread
+//EED 2018-08-20
+//  class ThreadedImageReader: public wxThread
+  class ThreadedImageReader: public wxThreadEED2
   {
   public:
     ThreadedImageReader(MultiThreadImageReader* tir) :
       mMultiThreadImageReader(tir)
     {}
-
     void* Entry();
     void  OnExit();
-
     vtkImageData* Read(const std::string& filename);
-    
        struct deleter
        {
                void operator()(ThreadedImageReader* p)
@@ -72,11 +85,9 @@ namespace creaImageIO
        };
        friend struct deleter;
 
-
   private:
     ImageReader mReader;
     MultiThreadImageReader* mMultiThreadImageReader;
-       
   };
 
   //=====================================================================
@@ -85,7 +96,7 @@ namespace creaImageIO
   //=====================================================================
   MultiThreadImageReader::MultiThreadImageReader(int number_of_threads)
     : //mDoNotSignal(false),
-      mReader(0),
+      mReader(NULL),
       mTotalMem(0),
       mTotalMemMax(1000000)
   {
@@ -94,14 +105,14 @@ namespace creaImageIO
 
          mDone = false;
     // Create the threads
+       
     for (int i=0; i<number_of_threads; i++) 
-      {
-                 //ThreadedImageReader* t = new ThreadedImageReader(this);
-                 boost::shared_ptr<ThreadedImageReader> t(new ThreadedImageReader(this), ThreadedImageReader::deleter());
-       mThreadedImageReaderList.push_back(t);
-        std::cout << "  ===> Thread "<<i
-                     <<" successfully added"<< std::endl;
-      }
+    {
+               //ThreadedImageReader* t = new ThreadedImageReader(this);
+               boost::shared_ptr<ThreadedImageReader> t(new ThreadedImageReader(this), ThreadedImageReader::deleter());
+               mThreadedImageReaderList.push_back(t);
+               std::cout << "  ===> Thread "<<i <<" successfully added"<< std::endl;
+      } // for
     mNumberOfThreadedReadersRunning = 0;
     // Init the queue
     mQueue.set(mComparator);
@@ -119,7 +130,6 @@ namespace creaImageIO
   //=====================================================================
   bool MultiThreadImageReader::Start()
   {
-
     //    std::cout << "#### MultiThreadImageReader::Start()"
     //               <<std::endl;
          if (mNumberOfThreadedReadersRunning > 0) return true;
@@ -128,24 +138,20 @@ namespace creaImageIO
     for (i =mThreadedImageReaderList.begin();
         i!=mThreadedImageReaderList.end();
         i++)
-      {
-       (*i)->Create();
-       if ( (*i)->Run() != wxTHREAD_NO_ERROR )
-         {
-           std::cout << "ERROR starting a thread"<< std::endl;
-           return false;
-         }
-       else 
-         {
-                   std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
-                             <<" successfully created"<< std::endl;
-           
-         }
-      }
-    wxMutexLocker locker(GetMultiThreadImageReaderUserMutex());
-    //    std::cout << "EO Start : #Threads running = "
-    //               << mNumberOfThreadedReadersRunning<<std::endl;
-
+    {
+               (*i)->Create();
+               if ( (*i)->Run() != wxTHREAD_NO_ERROR )
+                 {
+                       std::cout << "ERROR starting a thread"<< std::endl;
+                       return false;
+                 }     else  {
+                                       std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
+                                                 <<" successfully created"<< std::endl;
+                 } // if
+               } // for
+               wxMutexLocker locker(GetMultiThreadImageReaderUserMutex());
+               //    std::cout << "EO Start : #Threads running = "
+               //                    << mNumberOfThreadedReadersRunning<<std::endl;
     return true;
   }
   //=====================================================================
@@ -156,20 +162,23 @@ namespace creaImageIO
 //                 std::cout << "#### MultiThreadImageReader::Stop()"
 //           <<std::endl;
   //  std::cout << "Sending stop order to the threads..."<<std::endl;
+  
          if (mDone) return;
 
     ThreadedImageReaderListType::iterator i;
     for (i =mThreadedImageReaderList.begin();
         i!=mThreadedImageReaderList.end();
         i++)
-      { std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
+    { 
+               std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
                              <<" successfully stopped"<< std::endl;
                  if((*i)->IsAlive())
-                 {(*i)->Pause();
+                 {
+                         (*i)->Pause();
                          (*i).reset();
-                        //                       (*i)->Delete();
-                 }
-      }
+//                       (*i)->Delete();
+                 } // if i
+    } // for
    mThreadedImageReaderList.clear();
     // Wait a little to be sure that all threads have stopped
     // A better way to do this ?
@@ -196,19 +205,25 @@ namespace creaImageIO
     while (true);
 //        std::cout << "All threads stopped : OK "<<std::endl;
 
-    ImageMapType::iterator j;
-    for (j =mImages.begin();
-        j!=mImages.end();
-        ++j)
 
-      {
-       delete j->first;
-      }
-    mImages.clear();
+       CleanMImagesMap();
+       
        mDone = true;
+
   }
   //=====================================================================
 
+  
+   void MultiThreadImageReader::CleanMImagesMap()
+  {
+     ImageMapType::iterator j;
+     for (j=mImages.begin(); j!=mImages.end(); ++j)
+        {
+               delete j->first;
+     } //for 
+     mImages.clear();
+  }
+  
   //=====================================================================
   MultiThreadImageReader::~MultiThreadImageReader()
   {
@@ -217,6 +232,17 @@ namespace creaImageIO
     Stop();
     if (mReader) delete mReader;
        mThreadedImageReaderList.clear();
+
+       CleanMImagesMap();
+       
+/*     
+       ImageMapType::iterator it;
+       for (it=mImages.begin() ; it!=mImages.end(); it++)
+       {
+                       printf("MultiThreadImageReader::~MultiThreadImageReader  %s ", it.first->GetFilename() );
+       } // for it
+*/
+       
   }
   //=====================================================================
 
@@ -361,29 +387,28 @@ namespace creaImageIO
        //                if (mNumberOfThreadedReadersRunning==0)
        //      if (mThreadedImageReaderList.size()==0)
        if (true)
-         {
+       {
            ImageToLoad itl(this,filename);
            ImageMapType::iterator i = mImages.find(&itl);
            if (i!=mImages.end())
-             {
-               ImageToLoadPtr pitl = const_cast<ImageToLoadPtr>(i->first);
-               // Already inserted
-               if (pitl->GetImage() != 0)
-                 {
-                   // Already read
-                   UpdateUnloadPriority(pitl,
-                                        GetMaximalPriorityWithoutLocking()+1);
-                   return pitl->GetImage();
-                 }
-             }
+           {
+                       ImageToLoadPtr pitl = const_cast<ImageToLoadPtr>(i->first);
+                       // Already inserted
+                       if (pitl->GetImage() != NULL)
+                       {
+                               // Already read
+                               UpdateUnloadPriority( pitl, GetMaximalPriorityWithoutLocking()+1 );
+                               return pitl->GetImage();
+                       } // if pitl->GetImage()
+           } // if i
+               
            ImageToLoadPtr pitl = new ImageToLoad(this,filename,0);
-           mImages[pitl] = 0;
-           pitl->SetImage(mReader->ReadImage(filename));
-           UpdateUnloadPriority(pitl,
-                                GetMaximalPriorityWithoutLocking()+1);
+           mImages[pitl]               = NULL;
+           pitl->SetImage( mReader->ReadImage(filename) );
+           UpdateUnloadPriority( pitl, GetMaximalPriorityWithoutLocking()+1 );
            return pitl->GetImage();
-         }
-
+       } // if true
+       
        /*      
        mRequestedFilename = filename;
        mRequestedImage = 0;
@@ -450,6 +475,8 @@ namespace creaImageIO
     while (true);
     // 
     */
+       printf("EED MultiThreadImageReader::GetImage  END\n");  
+       
   }
   //=====================================================================
   
@@ -663,9 +690,7 @@ namespace creaImageIO
            //      std::cout << "### Thread "<<GetCurrentId()<<" : reading '"
            //                << i->GetFilename() << "' : DONE" << std::endl;
            
-         }
-       else 
-         {
+         }     else  {
            mMultiThreadImageReader->MultiThreadImageReaderEventUnlock();
            //mMutex.Unlock();
            // Wait a little to avoid blocking