Thread with an internal stack to record trace points. More...
#include <Thread.h>
Public Member Functions | |
| QStack< TraceBug * > * | bugStack () |
| QVector< TraceLog * > * | logVector () |
| void | setSleeping (bool s) |
| bool | sleeping () |
| void | start (QThread::Priority priority=QThread::InheritPriority) |
| void | startNoThread () |
| Thread (QObject *parent=0) | |
| ~Thread () | |
Static Public Member Functions | |
| static QList< QStack< TraceBug * > * > | bugStacks () |
| static Thread * | currentThread () |
| static int | idealThreadCount () |
| static void | lockThreads () |
| static QList< QVector < TraceLog * > * > | logVectors () |
| static void | msleep (unsigned long msecs) |
| static void | sleep (unsigned long secs) |
| static QStringList | threadNames () |
| static void | unlockThreads () |
| static void | usleep (unsigned long usecs) |
Thread with an internal stack to record trace points.
| QGpCoreTools::Thread::Thread | ( | QObject * | parent = 0 | ) |
: QThread(parent)
{
QMutexLocker ml(&_threadsMutex);
_threads.append(this);
_sleeping=true;
}
References QGpCoreTools::CoreApplication::instance(), and QGpCoreTools::CoreApplicationPrivate::threadDeleted().
{
QMutexLocker ml(&_threadsMutex);
int index=_threads.indexOf(this);
if(index>=0) {
_threads.removeAt(index);
CoreApplication::instance()->threadDeleted(this);
}
qDeleteAll(_logVector);
}
| QStack<TraceBug *>* QGpCoreTools::Thread::bugStack | ( | ) | [inline] |
Referenced by QGpCoreTools::TraceBug::TraceBug().
{return &_bugStack;}
| QList< QStack< TraceBug * > * > QGpCoreTools::Thread::bugStacks | ( | ) | [static] |
References QGpCoreTools::TraceBug::mainStack().
Referenced by QGpCoreTools::CoreApplicationPrivate::backTraceBug().
{
QList< QStack<TraceBug *> * > list;
list.append(TraceBug::mainStack());
for(QList<Thread *>::iterator it=_threads.begin(); it!=_threads.end(); it++ ) {
list.append((*it)->bugStack());
}
return list;
}
| static Thread* QGpCoreTools::Thread::currentThread | ( | ) | [inline, static] |
Referenced by msleep(), sleep(), and usleep().
{return static_cast<Thread *>(QThread::currentThread());}
| int QGpCoreTools::Thread::idealThreadCount | ( | ) | [static] |
An implementation that tries to take already running threads into account. The return number is always less or equal to the number of physical cores. Never returns a number less than 1.
References QGpCoreTools::CoreApplication::instance(), and QGpCoreTools::CoreApplicationPrivate::maximumThreadCount().
Referenced by QGpCoreTools::ParallelLoop::start().
{
int nThreads=CoreApplication::instance()->maximumThreadCount();
if(nThreads<2) return 1; // Exit as soon as possible for single processor machines
QSet<Thread *>::iterator it;
QMutexLocker ml(&_threadsMutex);
for(it=_runningThreads.begin(); it!=_runningThreads.end(); it++) {
if(!(*it)->sleeping()) nThreads--;
}
return nThreads>0 ? nThreads : 1;
}
| static void QGpCoreTools::Thread::lockThreads | ( | ) | [inline, static] |
Referenced by QGpCoreTools::CoreApplicationPrivate::backTrace(), and QGpCoreTools::CoreApplicationPrivate::backTraceBug().
{_threadsMutex.lock();}
| QVector<TraceLog *>* QGpCoreTools::Thread::logVector | ( | ) | [inline] |
Referenced by QGpCoreTools::TraceLog::TraceLog().
{return &_logVector;}
| QList< QVector< TraceLog * > * > QGpCoreTools::Thread::logVectors | ( | ) | [static] |
References QGpCoreTools::TraceLog::mainVector().
Referenced by QGpCoreTools::CoreApplicationPrivate::backTraceBug().
{
QList< QVector<TraceLog *> * > list;
list.append(TraceLog::mainVector());
for(QList<Thread *>::iterator it=_threads.begin(); it!=_threads.end(); it++ ) {
list.append((*it)->logVector());
}
return list;
}
| void QGpCoreTools::Thread::msleep | ( | unsigned long | msecs | ) | [static] |
References currentThread(), and setSleeping().
Referenced by Process::run().
{
Thread * t=currentThread();
_threadsMutex.lock();
if(msecs>10 && _runningThreads.contains(t)) {
_threadsMutex.unlock();
t->setSleeping(true);
QThread::msleep(msecs);
t->setSleeping(false);
} else {
_threadsMutex.unlock();
QThread::msleep(msecs);
}
}
| void QGpCoreTools::Thread::setSleeping | ( | bool | s | ) | [inline] |
Referenced by msleep(), SciFigs::LayerPainterThread::run(), sleep(), and usleep().
{_sleeping.fetchAndStoreOrdered(s);}
| void QGpCoreTools::Thread::sleep | ( | unsigned long | secs | ) | [static] |
References currentThread(), and setSleeping().
Referenced by Acquisition::stop().
{
Thread * t = currentThread();
_threadsMutex.lock();
if (_runningThreads.contains( t ) ) {
_threadsMutex.unlock();
t->setSleeping(true);
QThread::sleep(secs);
t->setSleeping(false);
} else {
_threadsMutex.unlock();
QThread::sleep( secs );
}
}
| bool QGpCoreTools::Thread::sleeping | ( | ) | [inline] |
{return _sleeping.testAndSetOrdered(true, true);}
| void QGpCoreTools::Thread::start | ( | QThread::Priority | priority = QThread::InheritPriority | ) |
Referenced by SciFigs::LayerPainter::LayerPainter(), SciFigs::CurveBrowser::loadMultiColumns(), main(), RealTimeArrayManager::RealTimeArrayManager(), GeopsyCore::AsciiSignalFormatReader::setFileName(), GeopsyCore::AsciiSignalFormatReader::setFormat(), GeopsyCore::CityScanner::setPath(), QGpCoreTools::ParallelLoop::start(), and QGpCoreTools::ColumnTextParser::startUpdates().
{
_threadsMutex.lock();
_runningThreads.insert(this);
_threadsMutex.unlock();
_sleeping=false;
QThread::start(priority);
_sleeping=true;
_threadsMutex.lock();
_runningThreads.remove(this);
_threadsMutex.unlock();
}
| void QGpCoreTools::Thread::startNoThread | ( | ) |
Referenced by QGpCoreTools::ParallelLoop::start().
{
run();
emit QThread::finished();
}
| QStringList QGpCoreTools::Thread::threadNames | ( | ) | [static] |
Referenced by QGpCoreTools::CoreApplicationPrivate::backTrace(), QGpCoreTools::CoreApplicationPrivate::backTraceBug(), and QGpCoreTools::CoreApplicationPrivate::bugInfo().
{
QMutexLocker ml(&_threadsMutex);
QStringList list;
list.append("main");
for(QList<Thread *>::iterator it=_threads.begin(); it!=_threads.end(); it++ ) {
list.append((*it)->objectName());
}
return list;
}
| static void QGpCoreTools::Thread::unlockThreads | ( | ) | [inline, static] |
Referenced by QGpCoreTools::CoreApplicationPrivate::backTrace(), and QGpCoreTools::CoreApplicationPrivate::backTraceBug().
{_threadsMutex.unlock();}
| void QGpCoreTools::Thread::usleep | ( | unsigned long | usecs | ) | [static] |
References currentThread(), and setSleeping().
{
Thread * t = currentThread();
_threadsMutex.lock();
if (usecs>10000 && _runningThreads.contains(t)) {
_threadsMutex.unlock();
t->setSleeping(true);
QThread::usleep(usecs);
t->setSleeping(false);
} else {
_threadsMutex.unlock();
QThread::usleep(usecs);
}
}