1 #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__
2 #define __creaImageIOThreadedImageReader_h_INCLUDED__
4 #include <creaImageIOSystem.h>
5 #include <creaImageIOImageReader.h>
6 #include <creaImageIOIndexedHeap.h>
17 //=====================================================================
18 class ThreadedImageReader;
19 class MultiThreadImageReader;
20 //=====================================================================
22 //=====================================================================
23 class CREAIMAGEIO_EXPORT MultiThreadImageReaderUser
26 friend class ThreadedImageReader;
27 friend class MultiThreadImageReader;
29 MultiThreadImageReaderUser() {}
30 virtual ~MultiThreadImageReaderUser() {}
34 ThreadedReaderStarted,
35 ThreadedReaderStopped,
41 /// The virtual method to overload by MultiThreadImageReader users
42 /// It is called when an image has been loaded or unloaded
44 /// * The image file name which was requested
45 /// * The type of event
46 /// * If type==ImageLoaded the image pointer, else NULL pointer
47 virtual void OnMultiThreadImageReaderEvent( const std::string& filename,
51 inline void MultiThreadImageReaderEventLock()
52 { mMultiThreadImageReaderUserMutex.Lock(); }
53 inline void MultiThreadImageReaderEventUnlock()
54 { mMultiThreadImageReaderUserMutex.Unlock(); }
55 inline wxMutex& GetMultiThreadImageReaderUserMutex()
56 { return mMultiThreadImageReaderUserMutex; }
59 void MultiThreadImageReaderSendEvent( const std::string& filename,
62 wxMutex mMultiThreadImageReaderUserMutex;
64 //=====================================================================
66 //=====================================================================
68 /// TAKE CARE : For the moment it only supports a **SINGLE USER**
69 class MultiThreadImageReader : public MultiThreadImageReaderUser
72 friend class ThreadedImageReader;
74 /// Ctor with the number of threads to use
75 MultiThreadImageReader(int number_of_threads = 1);
77 ~MultiThreadImageReader();
79 /// Starts the reader = create the threads which start to check
80 /// periodically the queue of requested images to read
82 /// Stops the reader = stops the threads and delete the images loaded
85 /// Request the image "filename" with a given priority
86 /// When the image is ready (or an error occurred)
87 /// The observer's callback is invoked
88 void Request( MultiThreadImageReaderUser* user,
89 const std::string& filename,
92 /// Request the image "filename" immediately
93 /// Blocks until image loaded
94 /// (no user callback but image returned)
95 vtkImageData* GetImage(const std::string& filename);
98 int GetMaximalPriority();
101 void OnMultiThreadImageReaderEvent( const std::string& filename,
103 vtkImageData* image);
106 int GetMaximalPriorityWithoutLocking();
111 ImageToLoad( MultiThreadImageReaderUser* user,
112 const std::string& filename,
125 // std::cout << "Refs = "<<mImage->GetReferenceCount()<<std::endl;
129 MultiThreadImageReaderUser* GetUser() const { return mUser; }
130 void SetUser( MultiThreadImageReaderUser* u ) { mUser = u; }
131 const std::string& GetFilename() const { return mFilename; }
132 int GetPriority() const { return mPriority; }
133 void SetPriority(int p) { mPriority=p; }
134 int& Index() { return mIndex; }
135 int& UnloadIndex() { return mUnloadIndex; }
136 vtkImageData* GetImage() const { return mImage; }
137 void SetImage( vtkImageData* i ) { mImage=i; }
139 MultiThreadImageReaderUser* mUser;
140 std::string mFilename;
144 vtkImageData* mImage;
148 /// Type of pointer on an ImageToLoad struct
149 typedef ImageToLoad* ImageToLoadPtr;
151 /// ImageToLoadPtr comparator on priority (for image queue)
152 struct ImageToLoadPtrPriorityComparator
154 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
157 return ( a->GetPriority() > b->GetPriority() );
160 /// ImageToLoadPtr comparator on inverse priority (for image to unload queue)
161 struct ImageToLoadPtrInversePriorityComparator
163 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
166 return ( a->GetPriority() < b->GetPriority() );
171 /// ImageToLoadPtr comparator on filename (for image map)
172 struct ImageToLoadPtrFilenameComparator
174 bool operator() (ImageToLoadPtr const & a, ImageToLoadPtr const & b)
177 return ( a->GetFilename() < b->GetFilename() );
181 /// ImageToLoadPtr indexer for image queue
182 struct ImageToLoadPtrIndexer
184 int& operator()(ImageToLoadPtr & t) const { return t->Index(); }
186 /// ImageToLoadPtr indexer for to unload image queue
187 struct ImageToUnloadPtrIndexer
189 int& operator()(ImageToLoadPtr & t) const { return t->UnloadIndex(); }
192 /// The callback from threaded readers when an image is read
193 void SignalImageRead(ImageToLoadPtr p, bool purge);
195 /// The type of map of images
196 typedef std::map<ImageToLoadPtr,vtkImageData*,
197 ImageToLoadPtrFilenameComparator> ImageMapType;
198 /// The map of images
199 ImageMapType mImages;
200 /// Comparator for the image to load queue
201 ImageToLoadPtrPriorityComparator mComparator;
202 /// Indexer for the image to load queue
203 ImageToLoadPtrIndexer mIndexer;
204 /// The image to load priority queue
205 IndexedHeap<ImageToLoadPtr,
206 ImageToLoadPtrPriorityComparator,
207 ImageToLoadPtrIndexer> mQueue;
209 /// The type of list of threaded readers
210 typedef std::vector<ThreadedImageReader*> ThreadedImageReaderListType;
211 ThreadedImageReaderListType mThreadedImageReaderList;
212 /// The number of currently running threaded readers
213 int mNumberOfThreadedReadersRunning;
214 /// The mutex used to access safely internal data from any thread
215 /// LG : Removed ! We now use the embedded mutex in User from which
219 /// For GetImage : the filename requested
220 std::string mRequestedFilename;
221 /// For GetImage : the image requested
222 vtkImageData* mRequestedImage;
224 /// If number of threads == 0 then uses an internal non-threaded reader
225 ImageReader* mReader;
227 /// The type of list of images loaded
228 /// used to unload oldest image when memory limit exceeded
229 /// The image to unload priority queue
230 IndexedHeap<ImageToLoadPtr,
231 ImageToLoadPtrInversePriorityComparator,
232 ImageToUnloadPtrIndexer> mUnloadQueue;
234 void UpdateUnloadPriority(ImageToLoadPtr p, int priority);
239 }; // class MultiThreadImageReader
240 //=====================================================================
244 } // namespace creaImageIO
248 #endif // #ifndef __creaImageIOThreadedImageReader_h_INCLUDED__