SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GUIRunThread.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // The thread that runs the simulation
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <cassert>
34 #include <string>
35 #include <iostream>
36 #include <algorithm>
37 
38 #include <guisim/GUINet.h>
42 #include "GUIApplicationWindow.h"
43 #include "GUIRunThread.h"
44 #include "GUIGlobals.h"
47 #include <utils/common/SysUtils.h>
52 
53 #ifndef NO_TRACI
55 #endif
56 
57 #ifdef CHECK_MEMORY_LEAKS
58 #include <foreign/nvwa/debug_new.h>
59 #endif // CHECK_MEMORY_LEAKS
60 
61 
62 // ===========================================================================
63 // member method definitions
64 // ===========================================================================
66  FXRealSpinDial& simDelay, MFXEventQue& eq,
68  : FXSingleEventThread(app, parent),
69  myNet(0), myHalting(true), myQuit(false), mySimulationInProgress(false), myOk(true),
70  mySimDelay(simDelay), myEventQue(eq), myEventThrow(ev) {
74 }
75 
76 
78  // the thread shall stop
79  myQuit = true;
80  deleteSim();
81  delete myErrorRetriever;
82  delete myMessageRetriever;
83  delete myWarningRetriever;
84  // wait for the thread
85  while (mySimulationInProgress || myNet != 0);
86 }
87 
88 
89 bool
91  assert(net != 0);
92  // assign new values
93  myNet = net;
94  mySimStartTime = start;
95  mySimEndTime = end;
96  // register message callbacks
100  // preload the routes especially for TraCI
102  try {
103  net->loadRoutes();
104  } catch (ProcessError& e2) {
105  if (std::string(e2.what()) != std::string("Process Error") && std::string(e2.what()) != std::string("")) {
106  WRITE_ERROR(e2.what());
107  }
108  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
109  myHalting = true;
110  myOk = false;
111  mySimulationInProgress = false;
112 #ifndef _DEBUG
113  } catch (...) {
114  myHalting = true;
115  myOk = false;
116  mySimulationInProgress = false;
117 #endif
118  }
120  return myOk;
121 }
122 
123 
124 FXint
126  long beg = 0;
127  long end = -1;
128  // perform an endless loop
129  while (!myQuit) {
130  // if the simulation shall be perfomed, do it
131  if (!myHalting && myNet != 0 && myOk) {
132  if (getNet().logSimulationDuration()) {
134  if (end != -1) {
135  getNet().setIdleDuration((int)(beg - end));
136  }
137  }
138  // check whether we shall stop at this step
140  // do the step
141  makeStep();
142  // stop if wished
143  if (haltAfter) {
144  stop();
145  }
146  // wait if wanted
147  long wait = (long) mySimDelay.getValue();
148  if (getNet().logSimulationDuration()) {
150  getNet().setSimDuration((int)(end - beg));
151  wait -= (end - beg);
152  }
153  if (wait > 0) {
154  sleep(wait);
155  }
156  } else {
157  // sleep if the simulation is not running
158  sleep(500);
159  }
160  }
161  // delete a maybe existing simulation at the end
162  deleteSim();
163  return 0;
164 }
165 
166 
167 void
169  GUIEvent* e = 0;
170  // simulation is being perfomed
171  mySimulationInProgress = true;
172  // execute a single step
173  try {
178 
179  // inform parent that a step has been performed
180  e = new GUIEvent_SimulationStep();
181  myEventQue.add(e);
183 
184  e = 0;
186 #ifndef NO_TRACI
187  if (state != MSNet::SIMSTATE_RUNNING) {
188  if (OptionsCont::getOptions().getInt("remote-port") != 0 && !TraCIServer::wasClosed()) {
189  state = MSNet::SIMSTATE_RUNNING;
190  }
191  }
192 #endif
193  switch (state) {
198  WRITE_MESSAGE("Simulation ended at time: " + time2string(myNet->getCurrentTimeStep()));
199  WRITE_MESSAGE("Reason: " + MSNet::getStateMessage(state));
201  break;
202  default:
203  break;
204  }
205  if (e != 0) {
206  myEventQue.add(e);
208  myHalting = true;
209  }
210  // stop the execution when only a single step should have
211  // been performed
212  if (mySingle) {
213  myHalting = true;
214  }
215  // simulation step is over
216  mySimulationInProgress = false;
217  } catch (ProcessError& e2) {
218  if (std::string(e2.what()) != std::string("Process Error") && std::string(e2.what()) != std::string("")) {
219  WRITE_ERROR(e2.what());
220  }
221  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
223  mySimulationInProgress = false;
225  myEventQue.add(e);
227  myHalting = true;
228  myOk = false;
229 #ifndef _DEBUG
230  } catch (...) {
232  mySimulationInProgress = false;
234  myEventQue.add(e);
236  myHalting = true;
237  myOk = false;
238 #endif
239  }
240 }
241 
242 
243 void
245  mySingle = false;
246  myHalting = false;
247 }
248 
249 
250 void
252  mySingle = true;
253  myHalting = false;
254 }
255 
256 
257 void
259  // report the begin when wished
260  WRITE_MESSAGE("Simulation started with time: " + time2string(mySimStartTime));
261  myOk = true;
262 }
263 
264 
265 void
267  mySingle = false;
268  myHalting = true;
269 }
270 
271 
272 bool
274  return myNet != 0;
275 }
276 
277 
278 void
280  myHalting = true;
281  // remove message callbacks
285  //
287  if (myNet != 0) {
289  }
290  while (mySimulationInProgress);
291  delete myNet;
293  myNet = 0;
297 }
298 
299 
300 GUINet&
302  return *myNet;
303 }
304 
305 
306 void
308  myHalting = true;
309  myQuit = true;
310 }
311 
312 
313 void
314 GUIRunThread::retrieveMessage(const MsgHandler::MsgType type, const std::string& msg) {
315  GUIEvent* e = new GUIEvent_Message(type, msg);
316  myEventQue.add(e);
318 }
319 
320 
321 bool
323  return myNet != 0 && myHalting;
324 }
325 
326 
327 bool
329  return myNet != 0 && (!myHalting);
330 }
331 
332 
333 bool
335  return myNet != 0 && myHalting;
336 }
337 
338 
339 
340 /****************************************************************************/
341