Qt_Core_AD_6 - 8BitsCoding/RobotMentor GitHub Wiki


// main.cpp
#include <QtCore/QCoreApplication>

#include <qthread.h>
#include <qthreadpool.h>
#include <qmutex.h>
#include <qdebug.h>

#include "worker.h"
#include "Counter.h"

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	Counter counter;
	QMutex mutex; (QMutex::Recursive);
	QThreadPool* pool = QThreadPool::globalInstance();

	qInfo() << "Count: " << counter.count();

	for (int i = 0; i < pool->maxThreadCount();i++) {
		worker* w = new worker(&a, &counter, &mutex);
		w->setAutoDelete(true);
		pool->start(w);
	}

	pool->waitForDone();

	qInfo() << "Done, the count is: " << counter.count();

	return a.exec();
}
// Counter.h
#pragma once

#include <QObject>
#include <qdebug.h>

class Counter : public QObject
{
	Q_OBJECT

public:
	explicit Counter(QObject *parent = nullptr);
	~Counter();

	void increment();
	void decrement();
	int count();

signals:

public slots:

private:
	int value = 0;
};
// Counter.cpp
#include "Counter.h"

Counter::Counter(QObject *parent)
	: QObject(parent)
{
}

Counter::~Counter()
{
}


void Counter::increment()
{
	value++;
}

void Counter::decrement()
{
	value--;
}

int Counter::count()
{
	return value;
}
// worker.h
#pragma once

#include <QObject>
#include <qthread.h>
#include <qrunnable.h>
#include <qdebug.h>
#include <qrandom.h>
#include <qmutex.h>

#include "Counter.h"

class worker : public QObject, public QRunnable
{
	Q_OBJECT

public:
	explicit worker(QObject *parent = nullptr, Counter* counter = nullptr, QMutex* mutex = nullptr);
	
	void run();

signals:

public slots:


private:
	Counter* counter;
	QMutex* mutex;
};
// worker.cpp
#include "worker.h"


worker::worker(QObject* parent, Counter* counter, QMutex* mutex) : QObject(parent), QRunnable()
{
	this->counter = counter;
	this->mutex = mutex;
}

void worker::run()
{
	if (!counter) return;

	qInfo() << this << " Starting";

	for (int i = 0; i < 100; i++) {
		// Without our mutex, the count is wildy out of control
		// Only lock for short term durations:

		QMutexLocker locker(mutex);
		counter->increment();
		qInfo() << this << " Count: " << counter->count();
		counter->decrement();
	}

	qInfo() << this << " Finished";
}

이미지

⚠️ **GitHub.com Fallback** ⚠️