// main.cpp
#include <QtCore/QCoreApplication>
#include <qdebug.h>
#include <qthreadpool.h>
#include <qsemaphore.h>
#include "worker.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStringList data;
for (int i = 0; i < 100; i++) {
data.append(QString::number(i));
}
QThreadPool* pool = QThreadPool::globalInstance();
QSemaphore sema(100);
for (int i = 0; i < data.length();i++)
{
worker* w = new worker(&a, &data, &sema, i);
w->setAutoDelete(true);
pool->start(w);
}
pool->waitForDone();
foreach(QString string, data)
{
qInfo() << string;
}
return a.exec();
}
// worker.h
#pragma once
#include <QObject>
#include <qdebug.h>
#include <qthread.h>
#include <qrunnable.h>
#include <qsemaphore.h>
class worker : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit worker(QObject *parent = nullptr, QStringList* data = nullptr, QSemaphore* sema = nullptr, int position = -1);
~worker();
void run();
signals:
public slots:
private:
QStringList* data;
QSemaphore* sema;
int position;
};
// worker.cpp
#include "worker.h"
worker::worker(QObject* parent, QStringList* data, QSemaphore* sema, int position) : QObject(parent), QRunnable()
{
this->sema = sema;
this->data = data;
this->position = position;
}
worker::~worker()
{
}
void worker::run()
{
if (!data || !sema) {
qInfo() << "Missing pointers!";
return;
}
QString t;
t.sprintf("%08p", QThread::currentThread());
sema->acquire(1);
data->replace(position, QString::number(position) + " - " + t);
sema->release();
qInfo() << t << " Finished" << position;
}