// main.cpp
#include <QtCore/QCoreApplication>
#include <qdebug.h>
#include <qthread.h>
#include "manager.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread::currentThread()->setObjectName("Main");
manager m;
m.start();
return a.exec();
}
// manager.h
#pragma once
#include <QObject>
#include <qdebug.h>
#include <qthread.h>
#include <qlist.h>
#include "counter.h"
class manager : public QObject
{
Q_OBJECT
public:
explicit manager(QObject *parent = nullptr);
~manager();
void start();
signals:
public slots:
void started();
void finished();
private:
QList<QThread*> threads;
};
// manager.cpp
#include "manager.h"
manager::manager(QObject *parent)
: QObject(parent)
{
for (int i = 0; i < 5; i++) {
QThread* thread = new QThread(this);
thread->setObjectName("Thread " + QString::number(i));
qInfo() << "Created: " << thread->objectName();
connect(thread, &QThread::started, this, &manager::started);
connect(thread, &QThread::finished, this, &manager::finished);
threads.append(thread);
}
}
manager::~manager()
{
}
void manager::started()
{
QThread* thread = qobject_cast<QThread*>(sender());
if (!thread) return;
qInfo() << "Started: " << thread->objectName();
}
void manager::finished()
{
QThread* thread = qobject_cast<QThread*>(sender());
if (!thread) return;
qInfo() << "Finished: " << thread->objectName();
}
void manager::start()
{
qInfo() << "Starting ... ";
foreach(QThread * thread, threads) {
qInfo() << "Starting: " << thread->objectName();
counter* c = new counter();
c->moveToThread(thread);
connect(thread, &QThread::started, c, &counter::start);
thread->start();
}
}
// counter.h
#pragma once
#include <QObject>
#include <qdebug.h>
#include <qthread.h>
#include <qrandom.h>
class counter : public QObject
{
Q_OBJECT
public:
explicit counter(QObject *parent = nullptr);
~counter();
signals:
public slots:
void start();
};
// counter.cpp
#include "counter.h"
counter::counter(QObject *parent)
: QObject(parent)
{
}
counter::~counter()
{
}
void counter::start()
{
for (int i = 0; i < 20; i++)
{
qInfo() << QThread::currentThread()->objectName() << " = " << i;
auto value = static_cast<unsigned long>(QRandomGenerator::global()->bounded(500));
QThread::currentThread()->msleep(value);
}
QThread::currentThread()->quit();
}
