Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef UEVENTSMANAGER_H
00021 #define UEVENTSMANAGER_H
00022
00023 #include "rtabmap/utilite/UtiLiteExp.h"
00024
00025 #include "rtabmap/utilite/UEventsHandler.h"
00026 #include "rtabmap/utilite/UThreadNode.h"
00027 #include "rtabmap/utilite/ULogger.h"
00028 #include "rtabmap/utilite/UDestroyer.h"
00029
00030 #include <list>
00031 #include <map>
00032
00033
00034 class UEventDispatcher : public UThread
00035 {
00036 public:
00037 virtual ~UEventDispatcher();
00038 protected:
00039 friend class UEventsManager;
00040 UEventDispatcher();
00041
00042 virtual void mainLoop();
00043
00044 private:
00045 virtual void killCleanup();
00046
00047 private:
00048 UEvent * _event;
00049 std::vector<UEventsHandler*> _handlers;
00050 };
00051
00078 class UTILITE_EXP UEventsManager : public UThread{
00079
00080 public:
00081
00088 static void addHandler(UEventsHandler* handler);
00089
00096 static void removeHandler(UEventsHandler* handler);
00097
00110 static void post(UEvent * event, bool async = true, const UEventsSender * sender = 0);
00111
00112 static void createPipe(
00113 const UEventsSender * sender,
00114 const UEventsHandler * receiver,
00115 const std::string & eventName);
00116
00117 static void removePipe(
00118 const UEventsSender * sender,
00119 const UEventsHandler * receiver,
00120 const std::string & eventName);
00121
00122 static void removeAllPipes(const UEventsSender * sender);
00123 static void removeNullPipes(const UEventsSender * sender);
00124
00125 protected:
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 static UEventsManager* getInstance();
00136
00137
00138
00139
00140
00141
00142 UEventsManager();
00143
00144
00145
00146
00147 virtual ~UEventsManager();
00148
00149
00150
00151
00152
00153
00154
00155 friend class UDestroyer<UEventsManager>;
00156
00160 virtual void mainLoop();
00161
00162 private:
00163
00167 virtual void mainLoopKill();
00168
00169
00170
00171
00172
00173 virtual void dispatchEvents();
00174
00175
00176
00177
00178 virtual bool dispatchEvent(UEvent * event, const UEventsSender * sender);
00179
00180
00181
00182
00183
00184
00185
00186 void _addHandler(UEventsHandler* handler);
00187
00188
00189
00190
00191
00192
00193
00194 void _removeHandler(UEventsHandler* handler);
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 void _postEvent(UEvent * event, bool async = true, const UEventsSender * sender = 0);
00209
00210 std::list<UEventsHandler*> getPipes(
00211 const UEventsSender * sender,
00212 const std::string & eventName);
00213
00214 void _createPipe(
00215 const UEventsSender * sender,
00216 const UEventsHandler * receiver,
00217 const std::string & eventName);
00218
00219 void _removePipe(
00220 const UEventsSender * sender,
00221 const UEventsHandler * receiver,
00222 const std::string & eventName);
00223
00224 void _removeAllPipes(const UEventsSender * sender);
00225 void _removeNullPipes(const UEventsSender * sender);
00226
00227 private:
00228
00229 class Pipe
00230 {
00231 public:
00232 Pipe(const UEventsSender * sender, const UEventsHandler * receiver, const std::string & eventName) :
00233 sender_(sender),
00234 receiver_(receiver),
00235 eventName_(eventName)
00236 {}
00237 const UEventsSender * sender_;
00238 const UEventsHandler * receiver_;
00239 const std::string eventName_;
00240 };
00241
00242 static UEventsManager* instance_;
00243 static UDestroyer<UEventsManager> destroyer_;
00244 std::list<std::pair<UEvent*, const UEventsSender * > > events_;
00245 std::list<UEventsHandler*> handlers_;
00246 UMutex eventsMutex_;
00247 UMutex handlersMutex_;
00248 USemaphore postEventSem_;
00249 std::list<Pipe> pipes_;
00250 UMutex pipesMutex_;
00251 };
00252
00253 #endif // UEVENTSMANAGER_H