/*! \internal */ void QThreadPoolPrivate::startThread(QRunnable *runnable) { QThreadPoolThread *thread = new QThreadPoolThread(this); allThreads.insert(thread); ++activeThreads; if (runnable->autoDelete()) ++runnable->ref; thread->runnable = runnable; thread->start(); }
bool QThreadPoolPrivate::tryStart(QRunnable *task) { if (allThreads.isEmpty()) { // always create at least one thread startThread(task); return true; } // can't do anything if we're over the limit if (activeThreadCount() >= maxThreadCount) return false; if (waitingThreads > 0) { // recycle an available thread --waitingThreads; enqueueTask(task); return true; } if (!expiredThreads.isEmpty()) { // restart an expired thread QThreadPoolThread *thread = expiredThreads.dequeue(); Q_ASSERT(thread->runnable == 0); ++activeThreads; if (task->autoDelete()) ++task->ref; thread->runnable = task; thread->start(); return true; } // start a new thread startThread(task); return true; }