Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2004-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file MFXThreadEvent.h 15 : /// @author Mathew Robertson 16 : /// @author Daniel Krajzewicz 17 : /// @author Michael Behrisch 18 : /// @date 2004-03-19 19 : /// 20 : // 21 : /****************************************************************************/ 22 : #pragma once 23 : #include <config.h> 24 : 25 : #include "fxexdefs.h" 26 : #include "MFXBaseObject.h" 27 : 28 : namespace FXEX { 29 : 30 : /** 31 : * :Description 32 : * 33 : * Interthread communication object 34 : * 35 : *------------------------------------------------------------------ 36 : * 37 : * Usage: 38 : * 39 : * GUI_thread.h: 40 : * ============ 41 : * 42 : * class MyGUI::FXWhatEver 43 : * { 44 : * // constructor 45 : * MyGUI(...); 46 : * 47 : * // message IDs 48 : * enum { 49 : * ID_THREAD_EVENT = FXWhatEver::ID_LAST, 50 : * ID_LAST }; 51 : * 52 : * // message handler 53 : * long onThreadEvent(FXObject*, FXSelector, void*); 54 : * 55 : * // thread event object 56 : * MFXThreadEvent m_threadEvent; 57 : * }; 58 : * 59 : * GUI_thread.cpp: 60 : * ============== 61 : * 62 : * // message map 63 : * FXDEFMAP(MyGUI, FXWhatEver) = { 64 : * FXMAPFUNC(SEL_THREAD_EVENT, MyGUI::ID_THREAD_EVENT, MyGUI::onThreadEvent) 65 : * }; 66 : * 67 : * // constructor 68 : * MyGUI::MyGUI(...) 69 : * { 70 : * m_threadEvent.setTarget(this), 71 : * m_threadEvent.setSelector(ID_THREAD_EVENT); 72 : * } 73 : * 74 : * // message handler 75 : * long onThreadEvent(FXObject*, FXSelector, void*) 76 : * { 77 : * do something with the GUI 78 : * } 79 : * 80 : * Worker_thread.cpp: 81 : * ================= 82 : * 83 : * int threadFunction(...) 84 : * { 85 : * MFXThreadEvent* pThreadEvent = (MFXThreadEvent*)(ptr); 86 : * 87 : * while (not_finished) { 88 : * // work hard 89 : * ... 90 : * 91 : * // wake up GUI 92 : * if (something_happened_and_the_GUI_needs_to_know_it) { 93 : * pThreadEvent.signal(); 94 : * } 95 : * } 96 : * 97 : * ... 98 : * } 99 : * 100 : */ 101 : class /*FXAPI */MFXThreadEvent : public MFXBaseObject { 102 0 : FXDECLARE(MFXThreadEvent) 103 : 104 : private: 105 : MFXThreadEventHandle event; 106 : 107 : protected: 108 : MFXThreadEvent(const MFXThreadEvent&); 109 : MFXThreadEvent& operator=(const MFXThreadEvent&); 110 : 111 : public: 112 : enum { 113 : ID_THREAD_EVENT = MFXBaseObject::ID_LAST, 114 : ID_LAST 115 : }; 116 : 117 : public: 118 : long onThreadSignal(FXObject*, FXSelector, void*); 119 : long onThreadEvent(FXObject*, FXSelector, void*); 120 : 121 : public: 122 : /// Construct an object capable of signaling the main FOX event loop 123 : MFXThreadEvent(FXObject* tgt = NULL, FXSelector sel = 0); 124 : 125 : /** 126 : * Signal the event - using the SEL_THREAD FXSelector type 127 : * 128 : * This is meant to be called from the worker thread - it sends a mesage to 129 : * the target, which is in another thread. 130 : */ 131 : void signal(); 132 : 133 : /** 134 : * Signal the event - using the specified FXSelector 135 : * 136 : * This is meant to be called from the worker thread - it sends a mesage to 137 : * the target, which is in another thread. 138 : */ 139 : void signal(FXuint seltype); 140 : 141 : /// destructor 142 : virtual ~MFXThreadEvent(); 143 : }; 144 : 145 : } // namespace FXEX