Na podstawie inspiracji tą stroną https://doc.qt.io/qt-6/qthread.html popełniłem prosta klasę która można używać w taki sposób i powinna w wątku przetwarzać kolejne porcje Data
:
Ale koncepcja ta ma jeden feler, nie można sprawdzić ile jest do końca pracy wątku, ile jeszcze porcji Data
czeka na przetworzenie przez watek.
Ktoś może polecić jakiś przykład gdzie byłą by kolejka zadań aby można było policzyć ilość ?
Ewentualnie jak to przerobić ?
for (int i = 0; i < 100; ++i)
{
Data d{i};
emit Controler::Get().addWork(d);
}
for (int i = 0; i < 10; ++i)
{
Data d{i};
emit Controler::Get().addWork(d);
}
class Controler : public QObject
{
Q_OBJECT
Worker *worker{nullptr};
QThread workerThread;
public:
// Prevents any type of copy or new instance
Controler(const Controler&) = delete;
void operator=(const Controler&) = delete;
// singleton Controler&
static Controler& Get()
{
static Controler instance;
return instance;
}
private:
Controler(QObject *parent = nullptr)
{
worker = new Worker;
worker->moveToThread(&workerThread);
connect(this, &Controler::addWork, worker, &Worker::doWork);
workerThread.start();
}
~Controler()
{
stopAndWait();
}
private:
void stopAndWait()
{
qDebug()<<"stopAndWait begin";
workerThread.requestInterruption(); // worker->stop=true;
workerThread.quit();
workerThread.wait();
// workerThread.wait();
qDebug()<<"stopAndWait end";
}
signals:
void addWork(const Data&);
};
class Worker : public QObject
{
Q_OBJECT
public:
Worker()= default;
~Worker() override = default;
public slots:
void doWork(const Data &data){
if(QThread::currentThread()->isInterruptionRequested()) return; // if(stop) return;
qDebug()<< "doWork begin";
for(int i = 0 ; i < 5; ++i)
{
if(QThread::currentThread()->isInterruptionRequested()) return; // if(stop) return;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
qDebug()<< i;
if(QThread::currentThread()->isInterruptionRequested()) return; // if(stop) return;
}
qDebug()<< "doWork end";
}
};