00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __ZMessageLooperImpStd__
00026 #define __ZMessageLooperImpStd__ 1
00027 #include "zconfig.h"
00028
00029 #include "ZMessage.h"
00030
00031 #include <deque>
00032
00033
00034 #pragma mark -
00035 #pragma mark * ZMessageLooperImpStd
00036
00037 class ZMessageLooperImpStd
00038 {
00039 protected:
00040 ZMessageLooperImpStd();
00041 virtual ~ZMessageLooperImpStd();
00042
00043 void PreRunMessageLoop();
00044 bool RunMessageLoop(bool* inRunFlag);
00045 void ExitMessageLoop();
00046
00047 void QueueMessageImp(const ZMessage& inMessage);
00048 virtual void DispatchMessageImp(const ZMessage& inMessage) = 0;
00049
00050 public:
00051 int32 GetMessageLoopNesting();
00052
00053 bool RunNestedMessageLoop(bool* inRunFlag);
00054 void ExitNestedMessageLoop(bool* inRunFlag);
00055
00056 bool IsBusy();
00057
00058 static ZMessageLooperImpStd* sLooperForCurrentThread();
00059
00060 protected:
00061 ZMutex fMutex_MessageDispatch;
00062 ZCondition fCondition_MessageDispatch;
00063
00064 protected:
00065 ZMutex fMutex_Structure;
00066 ZCondition fCondition_Structure;
00067
00068
00069
00070 deque<ZMessage> fMessageQueue;
00071
00072 private:
00073 bool fRunMessageLoop;
00074 int32 fMessageLoopNesting;
00075 bigtime_t fTimeLastMessageDispatched;
00076 bool fDispatchingMessage;
00077 bool* fLooperExistsAddress;
00078 };
00079
00080
00081 #endif // __ZMessageLooperImpStd__