2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
29 #ifndef __creaImageIOQMultiThreadImageReader_h_INCLUDED__
30 #define __creaImageIOQMultiThreadImageReader_h_INCLUDED__
32 #include <creaImageIOSystem.h>
33 #include <creaImageIOImageReader.h>
34 #include <creaImageIOIndexedHeap.h>
47 //=====================================================================
48 class ThreadedImageReader;
49 class MultiThreadImageReader;
50 //=====================================================================
52 //=====================================================================
53 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
56 friend class ThreadedImageReader;
57 friend class MultiThreadImageReader;
59 MultiThreadImageReaderUser() {}
60 virtual ~MultiThreadImageReaderUser() {}
64 ThreadedReaderStarted,
65 ThreadedReaderStopped,
71 /// The virtual method to overload by MultiThreadImageReader users
72 /// It is called when an image has been loaded or unloaded
74 /// * The image file name which was requested
75 /// * The type of event
76 /// * If type==ImageLoaded the image pointer, else NULL pointer
77 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
81 inline void MultiThreadImageReaderEventLock()
82 { mMultiThreadImageReaderUserMutex.lock(); }
83 inline void MultiThreadImageReaderEventUnlock()
84 { mMultiThreadImageReaderUserMutex.unlock(); }
85 inline QMutex* GetMultiThreadImageReaderUserMutex()
86 { return &mMultiThreadImageReaderUserMutex; }
89 void MultiThreadImageReaderSendEvent( const std::string& filename,
92 QMutex mMultiThreadImageReaderUserMutex;
94 //=====================================================================
96 //=====================================================================
98 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
100 ///Class that allows parallel lectures of several images
101 class MultiThreadImageReader : public MultiThreadImageReaderUser
104 friend class ThreadedImageReader;
106 /// Ctor with the number of threads to use
107 MultiThreadImageReader(int number_of_threads = 1);
109 ~MultiThreadImageReader();
111 /// Starts the reader = create the threads which start to check
112 /// periodically the queue of requested images to read
114 /// Stops the reader = stops the threads and delete the images loaded
117 /// Request the image "filename" with a given priority
118 /// When the image is ready (or an error occurred)
119 /// The observer's callback is invoked
120 void Request( MultiThreadImageReaderUser* user,
121 const std::string& filename,
124 /// Request the image "filename" immediately
125 /// Blocks until image loaded
126 /// (no user callback but image returned)
127 vtkImageData* GetImage(const std::string& filename);
130 int GetMaximalPriority();
133 void OnMultiThreadImageReaderEvent( const std::string& filename,
135 vtkImageData* image);
137 /// Function to read attributes for a file
138 void getAttributes(const std::string filename, std::map <std::string , std::string> &infos, std::vector<std::string> i_attr);
142 int GetMaximalPriorityWithoutLocking();
143 ///Class that represents an image to be loaded
147 ImageToLoad( MultiThreadImageReaderUser* user,
148 const std::string& filename,
161 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
165 MultiThreadImageReaderUser* GetUser() const { return mUser; }
166 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
167 const std::string& GetFilename() const { return mFilename; }
168 int GetPriority() const { return mPriority; }
169 void SetPriority(int p) { mPriority=p; }
170 int& Index() { return mIndex; }
171 int& UnloadIndex() { return mUnloadIndex; }
172 vtkImageData* GetImage() const { return mImage; }
173 void SetImage( vtkImageData* i ) { mImage=i; }
175 std::map<std::string, std::string> getAttributes(const std::vector<std::string> i_attr);
177 MultiThreadImageReaderUser* mUser;
178 std::string mFilename;
182 vtkImageData* mImage;
186 /// Type of pointer on an ImageToLoad struct
187 typedef ImageToLoad* ImageToLoadPtr;
189 /// ImageToLoadPtr comparator on priority (for image queue)
190 struct ImageToLoadPtrPriorityComparator
192 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
195 return ( a->GetPriority() > b->GetPriority() );
198 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
199 struct ImageToLoadPtrInversePriorityComparator
201 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
204 return ( a->GetPriority() < b->GetPriority() );
209 /// ImageToLoadPtr comparator on filename (for image map)
210 struct ImageToLoadPtrFilenameComparator
212 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
215 return ( a->GetFilename() < b->GetFilename() );
219 /// ImageToLoadPtr indexer for image queue
220 struct ImageToLoadPtrIndexer
222 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
224 /// ImageToLoadPtr indexer for to unload image queue
225 struct ImageToUnloadPtrIndexer
227 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
230 /// The callback from threaded readers when an image is read
231 void SignalImageRead(ImageToLoadPtr p, bool purge);
233 /// The type of map of images
234 typedef std::map<ImageToLoadPtr,vtkImageData*,
235 ImageToLoadPtrFilenameComparator> ImageMapType;
236 /// The map of images
237 ImageMapType mImages;
238 /// Comparator for the image to load queue
239 ImageToLoadPtrPriorityComparator mComparator;
240 /// Indexer for the image to load queue
241 ImageToLoadPtrIndexer mIndexer;
242 /// The image to load priority queue
243 IndexedHeap<ImageToLoadPtr,
244 ImageToLoadPtrPriorityComparator,
245 ImageToLoadPtrIndexer> mQueue;
247 /// The type of list of threaded readers
248 typedef std::vector<boost::shared_ptr<ThreadedImageReader> > ThreadedImageReaderListType;
249 //typedef std::vector<ThreadedImageReader* > ThreadedImageReaderListType;
250 ThreadedImageReaderListType mThreadedImageReaderList;
251 /// The number of currently running threaded readers
252 int mNumberOfThreadedReadersRunning;
253 /// The mutex used to access safely internal data from any thread
254 /// LG : Removed ! We now use the embedded mutex in User from which
258 /// For GetImage : the filename requested
259 std::string mRequestedFilename;
260 /// For GetImage : the image requested
261 vtkImageData* mRequestedImage;
263 /// If number of threads == 0 then uses an internal non-threaded reader
264 ImageReader* mReader;
266 /// The type of list of images loaded
267 /// used to unload oldest image when memory limit exceeded
268 /// The image to unload priority queue
269 IndexedHeap<ImageToLoadPtr,
270 ImageToLoadPtrInversePriorityComparator,
271 ImageToUnloadPtrIndexer> mUnloadQueue;
273 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
278 }; // class MultiThreadImageReader
279 //=====================================================================
283 } // namespace creaImageIO
287 #endif // #ifndef __creaImageIOQMultiThreadImageReader_h_INCLUDED__