1 #ifndef __creaImageIOQMultiThreadImageReader_h_INCLUDED__
2 #define __creaImageIOQMultiThreadImageReader_h_INCLUDED__
4 #include <creaImageIOSystem.h>
5 #include <creaImageIOImageReader.h>
6 #include <creaImageIOIndexedHeap.h>
19 //=====================================================================
20 class ThreadedImageReader;
21 class MultiThreadImageReader;
22 //=====================================================================
24 //=====================================================================
25 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
28 friend class ThreadedImageReader;
29 friend class MultiThreadImageReader;
31 MultiThreadImageReaderUser() {}
32 virtual ~MultiThreadImageReaderUser() {}
36 ThreadedReaderStarted,
37 ThreadedReaderStopped,
43 /// The virtual method to overload by MultiThreadImageReader users
44 /// It is called when an image has been loaded or unloaded
46 /// * The image file name which was requested
47 /// * The type of event
48 /// * If type==ImageLoaded the image pointer, else NULL pointer
49 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
53 inline void MultiThreadImageReaderEventLock()
54 { mMultiThreadImageReaderUserMutex.lock(); }
55 inline void MultiThreadImageReaderEventUnlock()
56 { mMultiThreadImageReaderUserMutex.unlock(); }
57 inline QMutex* GetMultiThreadImageReaderUserMutex()
58 { return &mMultiThreadImageReaderUserMutex; }
61 void MultiThreadImageReaderSendEvent( const std::string& filename,
64 QMutex mMultiThreadImageReaderUserMutex;
66 //=====================================================================
68 //=====================================================================
70 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
72 ///Class that allows parallel lectures of several images
73 class MultiThreadImageReader : public MultiThreadImageReaderUser
76 friend class ThreadedImageReader;
78 /// Ctor with the number of threads to use
79 MultiThreadImageReader(int number_of_threads = 1);
81 ~MultiThreadImageReader();
83 /// Starts the reader = create the threads which start to check
84 /// periodically the queue of requested images to read
86 /// Stops the reader = stops the threads and delete the images loaded
89 /// Request the image "filename" with a given priority
90 /// When the image is ready (or an error occurred)
91 /// The observer's callback is invoked
92 void Request( MultiThreadImageReaderUser* user,
93 const std::string& filename,
96 /// Request the image "filename" immediately
97 /// Blocks until image loaded
98 /// (no user callback but image returned)
99 vtkImageData* GetImage(const std::string& filename);
102 int GetMaximalPriority();
105 void OnMultiThreadImageReaderEvent( const std::string& filename,
107 vtkImageData* image);
109 /// Function to read attributes for a file
110 void getAttributes(const std::string filename, std::map <std::string , std::string> &infos, std::vector<std::string> i_attr);
114 int GetMaximalPriorityWithoutLocking();
115 ///Class that represents an image to be loaded
119 ImageToLoad( MultiThreadImageReaderUser* user,
120 const std::string& filename,
133 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
137 MultiThreadImageReaderUser* GetUser() const { return mUser; }
138 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
139 const std::string& GetFilename() const { return mFilename; }
140 int GetPriority() const { return mPriority; }
141 void SetPriority(int p) { mPriority=p; }
142 int& Index() { return mIndex; }
143 int& UnloadIndex() { return mUnloadIndex; }
144 vtkImageData* GetImage() const { return mImage; }
145 void SetImage( vtkImageData* i ) { mImage=i; }
147 std::map<std::string, std::string> getAttributes(const std::vector<std::string> i_attr);
149 MultiThreadImageReaderUser* mUser;
150 std::string mFilename;
154 vtkImageData* mImage;
158 /// Type of pointer on an ImageToLoad struct
159 typedef ImageToLoad* ImageToLoadPtr;
161 /// ImageToLoadPtr comparator on priority (for image queue)
162 struct ImageToLoadPtrPriorityComparator
164 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
167 return ( a->GetPriority() > b->GetPriority() );
170 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
171 struct ImageToLoadPtrInversePriorityComparator
173 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
176 return ( a->GetPriority() < b->GetPriority() );
181 /// ImageToLoadPtr comparator on filename (for image map)
182 struct ImageToLoadPtrFilenameComparator
184 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
187 return ( a->GetFilename() < b->GetFilename() );
191 /// ImageToLoadPtr indexer for image queue
192 struct ImageToLoadPtrIndexer
194 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
196 /// ImageToLoadPtr indexer for to unload image queue
197 struct ImageToUnloadPtrIndexer
199 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
202 /// The callback from threaded readers when an image is read
203 void SignalImageRead(ImageToLoadPtr p, bool purge);
205 /// The type of map of images
206 typedef std::map<ImageToLoadPtr,vtkImageData*,
207 ImageToLoadPtrFilenameComparator> ImageMapType;
208 /// The map of images
209 ImageMapType mImages;
210 /// Comparator for the image to load queue
211 ImageToLoadPtrPriorityComparator mComparator;
212 /// Indexer for the image to load queue
213 ImageToLoadPtrIndexer mIndexer;
214 /// The image to load priority queue
215 IndexedHeap<ImageToLoadPtr,
216 ImageToLoadPtrPriorityComparator,
217 ImageToLoadPtrIndexer> mQueue;
219 /// The type of list of threaded readers
220 typedef std::vector<boost::shared_ptr<ThreadedImageReader> > ThreadedImageReaderListType;
221 //typedef std::vector<ThreadedImageReader* > ThreadedImageReaderListType;
222 ThreadedImageReaderListType mThreadedImageReaderList;
223 /// The number of currently running threaded readers
224 int mNumberOfThreadedReadersRunning;
225 /// The mutex used to access safely internal data from any thread
226 /// LG : Removed ! We now use the embedded mutex in User from which
230 /// For GetImage : the filename requested
231 std::string mRequestedFilename;
232 /// For GetImage : the image requested
233 vtkImageData* mRequestedImage;
235 /// If number of threads == 0 then uses an internal non-threaded reader
236 ImageReader* mReader;
238 /// The type of list of images loaded
239 /// used to unload oldest image when memory limit exceeded
240 /// The image to unload priority queue
241 IndexedHeap<ImageToLoadPtr,
242 ImageToLoadPtrInversePriorityComparator,
243 ImageToUnloadPtrIndexer> mUnloadQueue;
245 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
250 }; // class MultiThreadImageReader
251 //=====================================================================
255 } // namespace creaImageIO
259 #endif // #ifndef __creaImageIOQMultiThreadImageReader_h_INCLUDED__