X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIOMultiThreadImageReader.cpp;h=c442375d5620fb7594b959cf936eec2c4e949ad1;hb=1813f80def50d02057c58a83245739066f37f9f0;hp=3ee50de9a2e558912cfe0d8ac0e489e2cc1cd209;hpb=3a22e19184c369b130d4caa992a8e98e50c7a0ee;p=creaImageIO.git diff --git a/src/creaImageIOMultiThreadImageReader.cpp b/src/creaImageIOMultiThreadImageReader.cpp index 3ee50de..c442375 100644 --- a/src/creaImageIOMultiThreadImageReader.cpp +++ b/src/creaImageIOMultiThreadImageReader.cpp @@ -1,8 +1,40 @@ +/* +# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la Santé) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# This software is governed by the CeCILL-B license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-B +# license as circulated by CEA, CNRS and INRIA at the following URL +# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +# or in the file LICENSE.txt. +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-B license and that you accept its terms. +# ------------------------------------------------------------------------ +*/ + + +#include #include #include #include #include + #include + + #include #ifdef _DEBUG #define new DEBUG_NEW @@ -17,24 +49,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) @@ -44,11 +86,9 @@ namespace creaImageIO }; friend struct deleter; - private: ImageReader mReader; MultiThreadImageReader* mMultiThreadImageReader; - }; //===================================================================== @@ -57,7 +97,7 @@ namespace creaImageIO //===================================================================== MultiThreadImageReader::MultiThreadImageReader(int number_of_threads) : //mDoNotSignal(false), - mReader(0), + mReader(NULL), mTotalMem(0), mTotalMemMax(1000000) { @@ -66,14 +106,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; @@ -100,24 +139,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 ? @@ -168,19 +206,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() { @@ -189,6 +233,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 +*/ + } //===================================================================== @@ -211,6 +266,12 @@ namespace creaImageIO } } //===================================================================== + // function to read attributes for a file + void MultiThreadImageReader::getAttributes(const std::string filename, + std::map &infos,std::vector i_attr) + { + mReader->getAttributes(filename, infos, i_attr); + } //===================================================================== void MultiThreadImageReader::Request( MultiThreadImageReaderUser* user, @@ -312,10 +373,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; @@ -416,6 +473,7 @@ namespace creaImageIO while (true); // */ + } //===================================================================== @@ -429,7 +487,9 @@ namespace creaImageIO // std::cout << "user="<GetUser() <GetUser() == this ) + { GetMultiThreadImageReaderUserMutex().Unlock(); + } p->GetUser()->MultiThreadImageReaderSendEvent (p->GetFilename(), @@ -446,9 +506,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 "<