X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIOMultiThreadImageReader.cpp;h=288c9e8bdd0bc9815b1330b41690bebb36694139;hb=refs%2Fheads%2Fvtk8itk5wx3-macos;hp=c4056b0e82206f6cb334a53eb8753ab8e8986e34;hpb=c7482ec7d04a5e5987841932a6856ebd471cebdb;p=creaImageIO.git diff --git a/src/creaImageIOMultiThreadImageReader.cpp b/src/creaImageIOMultiThreadImageReader.cpp index c4056b0..288c9e8 100644 --- a/src/creaImageIOMultiThreadImageReader.cpp +++ b/src/creaImageIOMultiThreadImageReader.cpp @@ -31,6 +31,9 @@ #include #include + #include + + #include #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 t(new ThreadedImageReader(this), ThreadedImageReader::deleter()); - mThreadedImageReaderList.push_back(t); - std::cout << " ===> Thread "< t(new ThreadedImageReader(this), ThreadedImageReader::deleter()); + mThreadedImageReaderList.push_back(t); + std::cout << " ===> Thread "< 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<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< 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 "<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 +*/ + } //===================================================================== @@ -346,10 +372,7 @@ namespace creaImageIO //===================================================================== vtkImageData* MultiThreadImageReader::GetImage(const std::string& filename) { - // Start(); - // std::cout << "** MultiThreadImageReader::GetImage('"<(i->first); - // Already inserted - if (pitl->GetImage() != 0) - { - // Already read - UpdateUnloadPriority(pitl, - GetMaximalPriorityWithoutLocking()+1); - return pitl->GetImage(); - } - } + { + ImageToLoadPtr pitl = const_cast(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 +472,7 @@ namespace creaImageIO while (true); // */ + } //===================================================================== @@ -463,7 +486,9 @@ namespace creaImageIO // std::cout << "user="<GetUser() <GetUser() == this ) + { GetMultiThreadImageReaderUserMutex().Unlock(); + } p->GetUser()->MultiThreadImageReaderSendEvent (p->GetFilename(), @@ -480,9 +505,22 @@ namespace creaImageIO // wxMutexLocker lock(GetMultiThreadImageReaderUserMutex()); mUnloadQueue.insert(p); + + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 p->GetImage()->UpdateInformation(); p->GetImage()->PropagateUpdateExtent(); long ImMem = p->GetImage()->GetEstimatedMemorySize(); +#else + int ext[6]; + int dim[3]; + p->GetImage()->GetExtent(ext); + dim[0] = ext[1]-ext[0]+1; + dim[1] = ext[3]-ext[2]+1; + dim[2] = ext[5]-ext[4]+1; + long ImMem = dim[0]*dim[1]*dim[2]*p->GetImage()->GetScalarSize();; +#endif mTotalMem += ImMem; GimmickMessage(5,"==> Image in memory = "<GetFilename(); GimmickMessage(5,"'" << filename << "'" << std::endl); + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 mTotalMem -= unload->GetImage()->GetEstimatedMemorySize(); +#else + int ext[6]; + int dim[3]; + unload->GetImage()->GetExtent(ext); + dim[0] = ext[1]-ext[0]+1; + dim[1] = ext[3]-ext[2]+1; + dim[2] = ext[5]-ext[4]+1; + mTotalMem -= dim[0]*dim[1]*dim[2]*unload->GetImage()->GetScalarSize(); +#endif GimmickMessage(5," ==> Total mem = "<GetFilename() << "' : DONE" << std::endl; - } - else - { + } else { mMultiThreadImageReader->MultiThreadImageReaderEventUnlock(); //mMutex.Unlock(); // Wait a little to avoid blocking - Sleep(10); + wxMilliSleep(10); } }; // std::cout << "### Thread "<