]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOMultiThreadImageReader.cpp
move directory
[creaImageIO.git] / src2 / creaImageIOMultiThreadImageReader.cpp
index 9e4db3ced7ebd1bce3a3c987630dca2ae13adfa9..3ee50de9a2e558912cfe0d8ac0e489e2cc1cd209 100644 (file)
@@ -3,6 +3,10 @@
 #include <wx/utils.h>
 #include <creaImageIOSystem.h>
 
+#include <creaImageIOGimmick.h>
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
 namespace creaImageIO
 {
 
@@ -13,6 +17,7 @@ namespace creaImageIO
     vtkImageData* image)
   {
     wxMutexLocker lock(mMultiThreadImageReaderUserMutex);
+
     this->OnMultiThreadImageReaderEvent(filename,type,image);
   }
   //=====================================================================
@@ -30,12 +35,22 @@ namespace creaImageIO
 
     vtkImageData* Read(const std::string& filename);
     
+       struct deleter
+       {
+               void operator()(ThreadedImageReader* p)
+               {
+                       p->Delete();
+               }
+       };
+       friend struct deleter;
+
 
   private:
     ImageReader mReader;
     MultiThreadImageReader* mMultiThreadImageReader;
        
   };
+
   //=====================================================================
 
   
@@ -49,11 +64,15 @@ namespace creaImageIO
     //    std::cout << "#### MultiThreadImageReader::MultiThreadImageReader("
     //       << " #threads= " << number_of_threads <<" )"<<std::endl;
 
+         mDone = false;
     // Create the threads
     for (int i=0; i<number_of_threads; i++) 
       {
-       ThreadedImageReader* t = new ThreadedImageReader(this);
+                 //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;
       }
     mNumberOfThreadedReadersRunning = 0;
     // Init the queue
@@ -90,8 +109,8 @@ namespace creaImageIO
          }
        else 
          {
-           //      std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
-           //                <<" successfully created"<< std::endl;
+                   std::cout << "  ===> Thread "<<(*i)->GetCurrentId()
+                             <<" successfully created"<< std::endl;
            
          }
       }
@@ -109,18 +128,21 @@ 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()
+                             <<" successfully stopped"<< std::endl;
                  if((*i)->IsAlive())
-                 {
-                       (*i)->Delete();
+                 {(*i)->Pause();
+                         (*i).reset();
+                        //                       (*i)->Delete();
                  }
       }
-    mThreadedImageReaderList.clear();
+   mThreadedImageReaderList.clear();
     // Wait a little to be sure that all threads have stopped
     // A better way to do this ?
     //    wxMilliSleep(1000);
@@ -130,7 +152,7 @@ namespace creaImageIO
     do 
       {
        // Sleep a little
-       wxMilliSleep(10);
+               wxMilliSleep(10);
        // Lock
        {
          wxMutexLocker locker(GetMultiThreadImageReaderUserMutex());
@@ -155,6 +177,7 @@ namespace creaImageIO
        delete j->first;
       }
     mImages.clear();
+       mDone = true;
   }
   //=====================================================================
 
@@ -165,6 +188,7 @@ namespace creaImageIO
     //       <<std::endl;
     Stop();
     if (mReader) delete mReader;
+       mThreadedImageReaderList.clear();
   }
   //=====================================================================
 
@@ -194,7 +218,7 @@ namespace creaImageIO
                                        int priority )
   {
        wxMutexLocker lock(GetMultiThreadImageReaderUserMutex()); //mMutex);
-    
+
          if (mNumberOfThreadedReadersRunning==0)
 //    if (mThreadedImageReaderList.size()==0) 
       {
@@ -223,7 +247,6 @@ namespace creaImageIO
        return;
       }
 
-
     ImageToLoad itl(user,filename);
     ImageMapType::iterator i = mImages.find(&itl);
     if (i!=mImages.end())
@@ -279,7 +302,8 @@ namespace creaImageIO
       }
     else if (e==MultiThreadImageReaderUser::ThreadedReaderStopped)
       {
-       mNumberOfThreadedReadersRunning--;
+       
+                mNumberOfThreadedReadersRunning--;
        //      std::cout << "#TR=" << mNumberOfThreadedReadersRunning << std::endl;
       }
   }
@@ -463,7 +487,6 @@ namespace creaImageIO
 
        GimmickMessage(5," ==> Total mem = "<<mTotalMem<<" Ko "<<std::endl);
 
-
        if (user!=0) 
          {
            //      std::cout << "unlock..."<<std::endl;
@@ -474,7 +497,6 @@ namespace creaImageIO
               MultiThreadImageReaderUser::ImageUnloaded,
               0);
            //      std::cout << "event ok"<<std::endl;
-
          }     
 
        if (unload->Index()>=0)
@@ -494,8 +516,6 @@ namespace creaImageIO
        //          std::cout << "delete ok."<<std::endl;
 
       }
-    
-  
   }
   //=====================================================================
 
@@ -545,8 +565,7 @@ namespace creaImageIO
     // While was not deleted 
     while (!TestDestroy())
       {
-       //      std::cout << "### Thread "<<GetCurrentId()<<" waiting for image"
-       //        << std::endl;
+               //std::cout << "### Thread "<<GetCurrentId()<<" still alive"  << std::endl;
          
        // Lock the mutex
        mMultiThreadImageReader->MultiThreadImageReaderEventLock();