#include "SMXHelperThread.h" using namespace SMX; SMX::SMXHelperThread::SMXHelperThread(const string &sThreadName): SMXThread(m_Lock) { Start(sThreadName); } void SMX::SMXHelperThread::ThreadMain() { m_Lock.Lock(); while(true) { vector> funcs; swap(m_FunctionsToCall, funcs); // If we're shutting down and have no more functions to call, stop. if(funcs.empty() && m_bShutdown) break; // Unlock while we call the queued functions. m_Lock.Unlock(); for(auto &func: funcs) func(); m_Lock.Lock(); m_Event.Wait(250); } m_Lock.Unlock(); } void SMX::SMXHelperThread::RunInThread(function func) { m_Lock.AssertNotLockedByCurrentThread(); // Add func to the list, and poke the event to wake up the thread if needed. m_Lock.Lock(); m_FunctionsToCall.push_back(func); m_Event.Set(); m_Lock.Unlock(); }