HifiExperimentsname all the threads30c47795 years agoHistory
104 lines · 2.4 KB · C++
RawDownload
////  GenericThread.cpp//  libraries/shared/src////  Created by Brad Hefta-Gaub on 8/12/13.//  Copyright 2013 High Fidelity, Inc.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "GenericThread.h" #include <QDebug>#include <QtCore/QCoreApplication> #include "ThreadHelpers.h" GenericThread::GenericThread() :    _stopThread(false),    _isThreaded(false) // assume non-threaded, must call initialize(){    } GenericThread::~GenericThread() {    // we only need to call terminate() if we're actually threaded and still running    if (isStillRunning() && isThreaded()) {        terminate();    }} void GenericThread::initialize(bool isThreaded, QThread::Priority priority) {    _isThreaded = isThreaded;    if (_isThreaded) {        _thread = new QThread(this);                // match the thread name to our object name        _thread->setObjectName(objectName());         connect(_thread, &QThread::started, this, [this] {            setThreadName("Generic thread " + objectName().toStdString());            started();            threadRoutine();        });        connect(_thread, &QThread::finished, this, &GenericThread::finished);         moveToThread(_thread);         // Starts an event loop, and emits _thread->started()        _thread->start();                _thread->setPriority(priority);    } else {        setup();    }} void GenericThread::terminate() {    if (_isThreaded) {        _stopThread = true;                terminating();         if (_thread) {            _thread->wait();            _thread->deleteLater();            _thread = NULL;        }    } else {        shutdown();    }} void GenericThread::threadRoutine() {    if (_isThreaded) {        setup();    }     while (!_stopThread) {        QCoreApplication::processEvents();         // override this function to do whatever your class actually does, return false to exit thread early        if (!process()) {            break;        }         // In non-threaded mode, this will break each time you call it so it's the        // callers responsibility to continuously call this method        if (!_isThreaded) {            break;        }    }     if (_isThreaded) {        shutdown();         // If we were on a thread, then quit our thread        if (_thread) {            _thread->quit();        }    }    }