From e2842ab7a472733cef92eef101674994028e345f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 3 Feb 2014 10:10:58 -0800 Subject: [PATCH] stop timers when the script does, add cleanup methods --- examples/timer.js | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 29 ++++++++++++++------ libraries/script-engine/src/ScriptEngine.h | 11 +++++--- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/examples/timer.js b/examples/timer.js index db9a51ef6f..c7ad0290ab 100644 --- a/examples/timer.js +++ b/examples/timer.js @@ -1,4 +1,4 @@ -var one_timer = Script.setTimeout(function() { print("One time timer fired!"); }, 1000); +var one_timer = Script.setTimeout(function() { print("One time timer fired!"); }, 10000); var multiple_timer = Script.setInterval(function() { print("Repeating timer fired!"); }, 1000); // this would stop a scheduled single shot timer diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 8e45c319c2..3b5cedb3ad 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -312,22 +312,35 @@ void ScriptEngine::timerFired() { } } -void ScriptEngine::setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot) { +QObject* ScriptEngine::setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot) { // create the timer, add it to the map, and start it QTimer* newTimer = new QTimer(this); - connect(newTimer, &QTimer::timeout, this, &ScriptEngine::timerFired); - _timerFunctionMap.insert(newTimer, function); - newTimer->setSingleShot(isSingleShot); + connect(newTimer, &QTimer::timeout, this, &ScriptEngine::timerFired); + + // make sure the timer stops when the script does + connect(this, &ScriptEngine::scriptEnding, newTimer, &QTimer::stop); + + _timerFunctionMap.insert(newTimer, function); + newTimer->start(intervalMS); + return newTimer; } -void ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) { - setupTimerWithInterval(function, intervalMS, false); +QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) { + return setupTimerWithInterval(function, intervalMS, false); } -void ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) { - setupTimerWithInterval(function, timeoutMS, true); +QObject* ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) { + return setupTimerWithInterval(function, timeoutMS, true); +} + +void ScriptEngine::stopTimer(QTimer *timer) { + if (_timerFunctionMap.contains(timer)) { + timer->stop(); + _timerFunctionMap.remove(timer); + delete timer; + } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index d706ed7bb0..12909a16eb 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -68,9 +68,11 @@ public slots: void stop(); void evaluate(); /// initializes the engine, and evaluates the script, but then returns control to caller - void setInterval(const QScriptValue& function, int intervalMS); - void setTimeout(const QScriptValue& function, int timeoutMS); - + QObject* setInterval(const QScriptValue& function, int intervalMS); + QObject* setTimeout(const QScriptValue& function, int timeoutMS); + void clearInterval(QObject* timer) { stopTimer(reinterpret_cast(timer)); } + void clearTimeout(QObject* timer) { stopTimer(reinterpret_cast(timer)); } + signals: void willSendAudioDataCallback(); void willSendVisualDataCallback(); @@ -87,7 +89,8 @@ protected: QHash _timerFunctionMap; private: - void setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); + QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); + void stopTimer(QTimer* timer); static VoxelsScriptingInterface _voxelsScriptingInterface; static ParticlesScriptingInterface _particlesScriptingInterface;