Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/gui/GUIRunThread.h
169666 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 GUIRunThread.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Sept 2002
19
///
20
// The thread that runs the simulation
21
/****************************************************************************/
22
#pragma once
23
#include <config.h>
24
25
#include <string>
26
#include <vector>
27
#include <set>
28
#include <iostream>
29
#include <utils/foxtools/fxheader.h>
30
#include <utils/foxtools/MFXSingleEventThread.h>
31
#include <utils/foxtools/MFXThreadEvent.h>
32
#include <utils/foxtools/MFXSynchQue.h>
33
#include <utils/common/SUMOTime.h>
34
35
36
// ===========================================================================
37
// class declarations
38
// ===========================================================================
39
class GUINet;
40
class GUIEvent;
41
class OutputDevice;
42
43
// ===========================================================================
44
// class definition
45
// ===========================================================================
46
/**
47
* @class GUIRunThread
48
* This thread executes the given simulation stepwise to allow parallel
49
* visualisation.
50
* The avoidance of collisions between the simulation execution and its
51
* visualisation is done individually for every lane using mutexes
52
*/
53
class GUIRunThread : public MFXSingleEventThread {
54
55
public:
56
/// @brief constructor
57
GUIRunThread(FXApp* app, MFXInterThreadEventClient* mw,
58
double& simDelay, MFXSynchQue<GUIEvent*>& eq,
59
FXEX::MFXThreadEvent& ev);
60
61
/// @brief destructor
62
virtual ~GUIRunThread();
63
64
/// @brief initialises the thread with the new simulation
65
virtual bool init(GUINet* net, SUMOTime start, SUMOTime end);
66
67
/// @brief starts the execution
68
virtual FXint run();
69
70
/// @brief called when the user presses the "resume"-button
71
/// @note this method resumes the execution after a break
72
void resume();
73
74
/// @brief called when the user presses the "single step"-button
75
/// @note this method allows the thread to perform a single simulation step
76
void singleStep();
77
78
/// @brief starts the simulation (execution of one step after another)
79
virtual void begin();
80
81
/// @brief halts the simulation execution
82
void stop();
83
84
/// @brief returns the information whether a network has been loaded
85
bool networkAvailable() const;
86
87
/// @brief check if simulation is startable
88
virtual bool simulationIsStartable() const;
89
90
/// @brief check if simulation is stopableo
91
virtual bool simulationIsStopable() const;
92
93
/// @brief check if simulation is stepable
94
virtual bool simulationIsStepable() const;
95
96
/// @brief deletes the existing simulation
97
virtual void deleteSim();
98
99
/// @brief returns the loaded network
100
GUINet& getNet() const;
101
102
/// @brief halts the thread before it shall be deleted
103
void prepareDestruction();
104
105
/// @brief Retrieves messages from the loading module
106
void retrieveMessage(const MsgHandler::MsgType type, const std::string& msg);
107
108
/// @brief get simulation begin time
109
SUMOTime getSimBegin() {
110
return mySimStartTime;
111
}
112
113
/// @brief get simulation end time
114
SUMOTime getSimEndTime() const {
115
return mySimEndTime;
116
}
117
118
/// @brief get list of breakpoints
119
std::vector<SUMOTime>& getBreakpoints() {
120
return myBreakpoints;
121
}
122
123
/// @brief get breakpoint lock
124
FXMutex& getBreakpointLock() {
125
return myBreakpointLock;
126
}
127
128
/// @brief enable lib SUMO
129
void enableLibsumo() {
130
myAmLibsumo = true;
131
}
132
133
/// @brief try simulation step
134
void tryStep();
135
136
protected:
137
/// @brief make simulation step
138
void makeStep();
139
140
/// @brief wait for snapshots
141
void waitForSnapshots(const SUMOTime snapshotTime);
142
143
protected:
144
/// @brief the loaded simulation network
145
GUINet* myNet;
146
147
/// @brief the times the simulation starts and ends with
148
SUMOTime mySimStartTime, mySimEndTime;
149
150
/// @brief information whether the simulation is halting (is not being executed)
151
bool myHalting;
152
153
/// @brief information whether the thread shall be stopped
154
/// @note if not, the thread stays in an endless loop)
155
bool myQuit;
156
157
/// @brief information whether a simulation step is being performed
158
/// @note otherwise the thread may be waiting or the simulation is maybe not performed at all
159
bool mySimulationInProgress;
160
161
/// @brief flag to check if all is ok
162
bool myOk;
163
164
/// @brief information whether the thread is running in single step mode
165
bool mySingle;
166
167
/// @brief whether the simulation already ended
168
bool myHaveSignaledEnd;
169
170
/// @brief @brief The instances of message retriever encapsulations
171
/// @note Needed to be deleted from the handler later on
172
OutputDevice* myErrorRetriever, *myMessageRetriever, *myWarningRetriever;
173
174
/// @brief simulation delay
175
double& mySimDelay;
176
177
/// @brief event queue
178
MFXSynchQue<GUIEvent*>& myEventQue;
179
180
/// @brief thrower events
181
FXEX::MFXThreadEvent& myEventThrow;
182
183
/// @brief mutex for lock simulation
184
FXMutex mySimulationLock;
185
186
/// @brief @brief List of breakpoints
187
std::vector<SUMOTime> myBreakpoints;
188
189
/// @brief @brief Lock for modifying the list of breakpoints
190
FXMutex myBreakpointLock;
191
192
/// @brief end of the last simulation step
193
long myLastEndMillis;
194
195
/// @brief last time the simulation took a microsecond break for the fox event loop to catch up (#9028)
196
long myLastBreakMillis;
197
198
/// @brief whether we are running in libsumo
199
bool myAmLibsumo;
200
};
201
202