File indexing completed on 2024-03-24 15:23:33

0001 /*
0002     SPDX-FileCopyrightText: 2010 Nokia Corporation and /or its subsidiary(-ies) <qt-info@nokia.com>
0003     All rights reserved.
0004 
0005     This file is part of the examples of the Qt Toolkit.
0006 
0007     SPDX-License-Identifier: BSD-3-Clause
0008 */
0009 
0010 #include "Thread.h"
0011 
0012 #include <QSignalMapper>
0013 
0014 Thread::Thread( QObject * const parent )
0015     : QThread( parent )
0016 {
0017     // we need a class that receives signals from other threads and emits a signal in response
0018     m_shutDownHelper = new QSignalMapper;
0019     m_shutDownHelper->setMapping( this, 0 );
0020     connect( this, SIGNAL(started()), this, SLOT(setReadyStatus()), Qt::DirectConnection );
0021     connect( this, SIGNAL(aboutToStop()), m_shutDownHelper, SLOT(map()));
0022 }
0023 
0024 Thread::~Thread()
0025 {
0026     delete m_shutDownHelper;
0027 }
0028 
0029 // starts thread, moves worker to this thread and blocks
0030 void Thread::launchWorker( QObject * const worker )
0031 {
0032     m_worker = worker;
0033     start();
0034     m_worker->moveToThread( this );
0035     m_shutDownHelper->moveToThread( this );
0036     connect( m_shutDownHelper, SIGNAL(mapped(int)), this, SLOT(stopExecutor()), Qt::DirectConnection );
0037     m_mutex.lock();
0038     m_waitCondition.wait( &m_mutex );
0039 }
0040 
0041 // puts a command to stop processing in the event queue of worker thread
0042 void Thread::stop()
0043 {
0044     emit aboutToStop();
0045 }
0046 
0047 // methods above this line should be called in ui thread context
0048 // methods below this line are private and will be run in  secondary thread context
0049 
0050 void Thread::stopExecutor()  //secondary thread context
0051 {
0052     exit();
0053 }
0054 
0055 void Thread::setReadyStatus()
0056 {
0057     m_waitCondition.wakeAll();
0058 }
0059 
0060 #include "moc_Thread.cpp"