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"