File indexing completed on 2024-04-14 03:47:40

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
0004 //
0005 
0006 // Self
0007 #include "AbstractWorkerThread.h"
0008 #include "MarbleDebug.h"
0009 
0010 // Qt
0011 #include <QMutex>
0012 
0013 namespace Marble
0014 {
0015 
0016 const int WAIT_ATTEMPTS = 20;
0017 const int WAIT_TIME = 100;
0018 
0019 class AbstractWorkerThreadPrivate
0020 {
0021  public:
0022     explicit AbstractWorkerThreadPrivate( AbstractWorkerThread *parent )
0023             : m_running( false ),
0024               m_end( false ),
0025               m_parent( parent )
0026     {
0027     }
0028 
0029     ~AbstractWorkerThreadPrivate()
0030     {
0031         m_end = true;
0032         m_parent->wait( 1000 );
0033     }
0034 
0035     QMutex m_runningMutex;
0036     bool m_running;
0037     bool m_end;
0038 
0039     AbstractWorkerThread *m_parent;
0040 };
0041 
0042 
0043 AbstractWorkerThread::AbstractWorkerThread( QObject *parent )
0044         : QThread( parent ),
0045           d( new AbstractWorkerThreadPrivate( this ) )
0046 {
0047 }
0048 
0049 AbstractWorkerThread::~AbstractWorkerThread()
0050 {
0051     delete d;
0052 }
0053 
0054 void AbstractWorkerThread::ensureRunning()
0055 {
0056     QMutexLocker locker( &d->m_runningMutex );
0057     if ( !d->m_running ) {
0058         if ( wait( 2 * WAIT_TIME ) ) {
0059             d->m_running = true;
0060             start( QThread::IdlePriority );
0061         }
0062     }
0063 }
0064 
0065 void AbstractWorkerThread::run()
0066 {
0067     int waitAttempts = WAIT_ATTEMPTS;
0068     while( !d->m_end ) {
0069         d->m_runningMutex.lock();
0070         if ( !workAvailable() ) {
0071             waitAttempts--;
0072             if ( !waitAttempts || d->m_end ) {
0073                 d->m_running = false;
0074                 d->m_runningMutex.unlock();
0075                 break;
0076             }
0077             else {
0078                 d->m_runningMutex.unlock();
0079                 msleep( WAIT_TIME );
0080             }
0081         }
0082         else {
0083             d->m_runningMutex.unlock();
0084             work();
0085 
0086             waitAttempts = WAIT_ATTEMPTS;
0087         }
0088     }
0089 }
0090 
0091 }
0092 
0093 #include "moc_AbstractWorkerThread.cpp"