#include #include #include #include #include class Job : public QRunnable { public: Job(QThreadPool* pool) : m_pool(pool) {} void run() override { static QAtomicInt _jobId = 0; const int jobId = ++_jobId; qDebug() << "JOB" << jobId << "STARTED" << QThread::currentThread(); #ifdef USE_IMPLICIT_QPOINTER_IN_SINGLESHOT QTimer::singleShot(0, m_pool.load(), [jobId]() { qDebug() << "JOB" << jobId << "COMPLETE" << QThread::currentThread(); }); #else QPointer kaboom = m_pool.load(); qDebug() << "JOB" << jobId << "OK"; #endif } private: QAtomicPointer m_pool; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); const int numJobs = QThread::idealThreadCount(); while(true) { QThreadPool coolpool; for (int i = 0; i < numJobs; ++i) coolpool.start(new Job(&coolpool)); while(!coolpool.waitForDone(0)) QCoreApplication::processEvents(); } return 0; }