Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 2 files). Show all
Unified · Split
| @@ -199,11 +199,28 @@ void ScriptEngine::waitTillDoneRunning() { · 198 unmodified lines | ||
| 199 | 199 | |
| 200 | 200 | // NOTE: waitTillDoneRunning() will be called on the main Application thread, inside of stopAllScripts() |
| 201 | 201 | // we want the application thread to continue to process events, because the scripts will likely need to |
| 202 | − // marshall messages across to the main thread. For example if they access Settings or Meny in any of their | |
| 202 | + // marshall messages across to the main thread. For example if they access Settings or Menu in any of their | |
| 203 | 203 | // shutdown code. |
| 204 | + auto startedWaiting = usecTimestampNow(); | |
| 204 | 205 | while (thread()->isRunning()) { |
| 205 | 206 | // process events for the main application thread, allowing invokeMethod calls to pass between threads |
| 206 | 207 | QCoreApplication::processEvents(); |
| 208 | + auto stillWaiting = usecTimestampNow(); | |
| 209 | + auto elapsed = stillWaiting - startedWaiting; | |
| 210 | + | |
| 211 | + // if we've been waiting a second or more, then tell the script engine to stop evaluating | |
| 212 | + if (elapsed > USECS_PER_SECOND) { | |
| 213 | + qDebug() << __FUNCTION__ << "...giving up on evaluation elapsed:" << elapsed << "calling abortEvaluation()"; | |
| 214 | + abortEvaluation(); | |
| 215 | + } | |
| 216 | + | |
| 217 | + // if we've been waiting for more than 5 seconds then we should be more aggessive about stopping | |
| 218 | + static const auto WAITING_TOO_LONG = USECS_PER_SECOND * 5; | |
| 219 | + if (elapsed > WAITING_TOO_LONG) { | |
| 220 | + qDebug() << __FUNCTION__ << "...giving up on thread elapsed:" << elapsed << "calling thread->quit()"; | |
| 221 | + thread()->quit(); | |
| 222 | + break; | |
| 223 | + } | |
| 207 | 224 | } |
| 208 | 225 | } |
| 209 | 226 | } |