61 Runner(
const char*
const runnerName =
nullptr)
noexcept
63 : fRunnerThread(
this, runnerName),
66 : fRunnerName(runnerName),
77 DAF_SAFE_ASSERT(! isRunnerActive());
86 virtual bool run() = 0;
92 bool shouldRunnerStop()
const noexcept
95 return fRunnerThread.shouldThreadExit();
97 return fIntervalId == 0;
107 bool isRunnerActive()
noexcept
110 return fRunnerThread.isThreadRunning();
112 return fIntervalId != 0;
119 bool startRunner(
const uint timeIntervalMilliseconds = 0)
noexcept
122 DAF_SAFE_ASSERT_RETURN(!fRunnerThread.isThreadRunning(),
false);
123 fTimeInterval = timeIntervalMilliseconds;
124 return fRunnerThread.startThread();
126 DAF_SAFE_ASSERT_RETURN(fIntervalId == 0,
false);
127 fIntervalId = d_emscripten_set_interval(_entryPoint, timeIntervalMilliseconds,
this);
136 bool stopRunner()
noexcept
139 return fRunnerThread.stopThread(-1);
141 signalRunnerShouldStop();
149 void signalRunnerShouldStop()
noexcept
152 fRunnerThread.signalThreadShouldExit();
154 if (fIntervalId != 0)
156 d_emscripten_clear_interval(fIntervalId);
168 const String& getRunnerName()
const noexcept
171 return fRunnerThread.getThreadName();
181 class RunnerThread :
public Thread
183 Runner*
const runner;
186 RunnerThread(Runner*
const r,
const char*
const rn)
193 const uint timeInterval = runner->fTimeInterval;
195 while (!shouldThreadExit())
197 bool stillRunning =
false;
200 stillRunning = runner->run();
203 if (stillRunning && !shouldThreadExit())
205 if (timeInterval != 0)
206 d_msleep(timeInterval);
223 void _runEntryPoint()
noexcept
225 bool stillRunning =
false;
228 stillRunning = run();
231 if (fIntervalId != 0 && !stillRunning)
233 d_emscripten_clear_interval(fIntervalId);
238 static void _entryPoint(
void*
const userData)
noexcept
240 static_cast<Runner*
>(userData)->_runEntryPoint();
244 DAF_DECLARE_NON_COPYABLE(Runner)