diff options
Diffstat (limited to 'src/sources/threadedtrigger.cpp')
-rw-r--r-- | src/sources/threadedtrigger.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/sources/threadedtrigger.cpp b/src/sources/threadedtrigger.cpp new file mode 100644 index 0000000..11f07b5 --- /dev/null +++ b/src/sources/threadedtrigger.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2007 by Ken Werner * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "threadedtrigger.h" +#include <qapplication.h> + +//#include "kdebug.h" + +ThreadedTrigger::ThreadedTrigger(TriggeredSource* inSource, unsigned long inRefreshSleep): + mSource(inSource), + mRefreshSleep(inRefreshSleep), + mRunning(false) + { + connect(mSource, SIGNAL(enabledChanged(bool, Source*)), this, SLOT(enable(bool))); +} + +ThreadedTrigger::~ThreadedTrigger(){ + enable(false); +} + +void ThreadedTrigger::enable(bool inEnable){ + if(inEnable && !mRunning){ // start this thread (calls run()) + //kdDebug() << "start thread " << mSource->getName() << endl; + // start the thread + mRunning = true; + this->start(QThread::LowPriority); + }else if(!inEnable && mRunning){ // stops the thread + //kdDebug() << "stop thread " << mSource->getName() << endl; + mRunning = false; + mWaitMutex.lock(); + mWaitCond.wakeOne(); + mWaitMutex.unlock(); + this->wait(); + } +} + +void ThreadedTrigger::run(){ + mWaitMutex.lock(); + while( mRunning ) { + QString text = mSource->fetchValue(); + UpdateEvent* ue = new UpdateEvent(text); // Qt will delete the ue when done + QApplication::postEvent(mSource, ue); // send the event to the TriggeredSource + if(mWaitCond.wait(&mWaitMutex, mRefreshSleep)) + break; // we were woken up + } + // if we are here, the mutex must be locked: + // 1. QWaitCondition::wait locks it when it returns + // 2. mWaitMutex is locked when we enter the loop + mWaitMutex.unlock(); // unlock it again +} |