- Timestamp:
- 04/16/09 03:41:58 (4 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/objective-cplusplus/i3/trunk/src/mil/include/mil/gui-windows/GuiModule.h
r32290 r32468 40 40 PVOID breakLoopRequest; 41 41 //DWORD_PTR destroyed; 42 PVOIDdestroyed;42 atomic<PVOID> destroyed; 43 43 44 44 bool repost; … … 50 50 51 51 public: 52 pool::Producer producer; 53 pool::Consumer consumer; 52 Tls tls; 54 53 55 54 GuiModule() : … … 66 65 67 66 ~GuiModule() { 68 if (!IsWindow(getWindow())) { 67 HWND w = getWindow(); 68 if (!IsWindow(w)) 69 { 69 70 return; 70 71 } 71 72 wndproc.inactivate(); 73 if (DestroyWindow(w) == 0) 74 { 75 // error 76 DebugBreak(); 77 } 72 78 } 73 79 … … 105 111 } 106 112 107 pool::MemoryList* m = target. consumer.work(&event);113 pool::MemoryList* m = target.tls.consumer.work(&event); 108 114 if (!m) { 109 115 return; … … 116 122 return; 117 123 } 118 (reinterpret_cast<GuiModule<Child> * >(t))->post(e, target. producer);124 (reinterpret_cast<GuiModule<Child> * >(t))->post(e, target.tls); 119 125 } 120 126 }; … … 141 147 { 142 148 //PostQuitMessage(0); 143 InterlockedExchangePointer(&breakLoopRequest, (PVOID)1); 144 if (InterlockedExchangePointer(&destroyed, (PVOID)1) != 0) 145 { 146 return; 147 } 148 HWND w = getWindow(); 149 if (!IsWindow(w)) 150 { 151 return; 152 } 153 if (DestroyWindow(w) == 0) 154 { 155 // error 156 DebugBreak(); 157 } 149 breakLoopRequest = (PVOID)1; 150 destroyed.store((PVOID)1); 158 151 } 159 152 160 153 void loop() 161 154 { 162 if (InterlockedCompareExchangePointer((PVOID*)&breakLoopRequest, NULL, NULL)) 163 { 164 //PostQuitMessage(0); 165 return; 166 } 167 168 if (!IsWindow(this->hLocalWnd)) { 155 if (breakLoopRequest || destroyed.load() || !IsWindow(this->hLocalWnd)) { 169 156 return; 170 157 } 171 158 172 159 MSG msg = {}; 173 for (;;)160 while (__builtin_expect(!breakLoopRequest, true)) 174 161 { 175 162 BOOL result = GetMessage(&msg, NULL, 0, 0); … … 190 177 191 178 template <typename T> 192 void post(const T& event, mil::pool::Producer& sender_producer) 193 { 194 HWND hWnd = getWindow(); 195 if (!hWnd) 196 { 197 // error 198 return; 199 } 179 void post(const T& event, mil::Tls& sender_tls) 180 { 181 HWND hWnd = sender_tls.thread[thread_id].hWnd; 182 if (__builtin_expect(!hWnd, false)) { 183 hWnd = getWindow(); 184 if (!IsWindow(hWnd)) { 185 return; 186 } 187 sender_tls.thread[thread_id].hWnd = hWnd; 188 } 189 200 190 if (sizeof(T) <= sizeof(LPARAM)) 201 191 { … … 207 197 return; 208 198 } 209 void* p = sender_producer.malloc<sizeof(Event<T>)>(); 199 200 void* p = sender_tls.producer.malloc<sizeof(Event<T>)>(); 210 201 if (p == NULL) 211 202 { … … 213 204 return; 214 205 } 206 215 207 Event<T>* e = new(p) Event<T>; 216 208 e->data = event; … … 248 240 return 0; 249 241 } else if (msg == WM_DESTROY || msg == WM_QUIT) { 250 InterlockedExchangePointer(&destroyed, (PVOID)1);242 destroy(); 251 243 } 252 244
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)