digiKam
Loading...
Searching...
No Matches
parallelworkers.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2012-01-13
7 * Description : Multithreaded worker objects, working in parallel
8 *
9 * SPDX-FileCopyrightText: 2010-2012 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 *
13 * ============================================================ */
14
15#pragma once
16
17// Qt includes
18
19#include <QObject>
20
21// Local includes
22
23#include "digikam_export.h"
24#include "workerobject.h"
25
26namespace Digikam
27{
28
29class DIGIKAM_EXPORT ParallelWorkers
30{
31
32public:
33
39 ParallelWorkers() = default;
40 virtual ~ParallelWorkers();
41
45 void schedule();
46 void deactivate(WorkerObject::DeactivatingMode mode = WorkerObject::FlushSignals);
47 void wait();
48
49 void setPriority(QThread::Priority priority);
50
54 bool optimalWorkerCountReached() const;
55
60 static int optimalWorkerCount();
61
62public:
63
65
66 bool connect(const char* signal,
67 const QObject* receiver,
68 const char* method,
69 Qt::ConnectionType type = Qt::AutoConnection) const;
70
71protected:
72
73 void add(WorkerObject* const worker);
74
75 // Internal implementation
76
80 int replacementQtMetacall(QMetaObject::Call _c, int _id, void** _a);
81 const QMetaObject* replacementMetaObject() const;
82
86 virtual QObject* asQObject() = 0;
87
91 virtual int WorkerObjectQtMetacall(QMetaObject::Call _c, int _id, void** _a) = 0;
92
96 virtual const QMetaObject* mocMetaObject() const = 0;
97
98 int replacementStaticQtMetacall(QMetaObject::Call _c, int _id, void** _a);
99 typedef void (*StaticMetacallFunction)(QObject*, QMetaObject::Call, int, void**);
100 virtual StaticMetacallFunction staticMetacallPointer() = 0;
101
102protected:
103
104 QList<WorkerObject*> m_workers;
105 int m_currentIndex = 0;
106 QMetaObject* m_replacementMetaObject = nullptr;
107
108 StaticMetacallFunction m_originalStaticMetacall = nullptr;
109
110private:
111
112 // Disable
113 ParallelWorkers(const ParallelWorkers&) = delete;
114 ParallelWorkers& operator=(const ParallelWorkers&) = delete;
115};
116
117// -------------------------------------------------------------------------------------------------
118
119template <class A>
120
121class ParallelAdapter : public A,
122 public ParallelWorkers
123{
124public:
125
136 ParallelAdapter() = default;
137 ~ParallelAdapter() override = default;
138
139 void add(A* const worker)
140 {
141 ParallelWorkers::add(worker);
142 }
143
144 // Internal Implementation
145 // I know this is a hack
146
147 int WorkerObjectQtMetacall(QMetaObject::Call _c, int _id, void** _a) override
148 {
149 return WorkerObject::qt_metacall(_c, _id, _a);
150 }
151
152 const QMetaObject* mocMetaObject() const override
153 {
154 return A::metaObject();
155 }
156
157 static void qt_static_metacall(QObject* o, QMetaObject::Call _c, int _id, void** _a)
158 {
159 static_cast<ParallelAdapter*>(o)->replacementStaticQtMetacall(_c, _id, _a);
160 }
161
166
167 const QMetaObject* metaObject() const override
168 {
170 }
171
172 int qt_metacall(QMetaObject::Call _c, int _id, void** _a) override
173 {
174 return ParallelWorkers::replacementQtMetacall(_c, _id, _a);
175 }
176
177 QObject* asQObject() override
178 {
179 return this;
180 }
181
182 void schedule()
183 {
185 }
186
191
192 void wait()
193 {
195 }
196
197 bool connect(const char* signal,
198 const QObject* receiver,
199 const char* method,
200 Qt::ConnectionType type = Qt::AutoConnection) const
201 {
202 return ParallelWorkers::connect(signal, receiver, method, type);
203 }
204
205private:
206
207 // Disable
208 ParallelAdapter(const ParallelAdapter&) = delete;
209 ParallelAdapter& operator=(const ParallelAdapter&) = delete;
210};
211
212} // namespace Digikam
Definition parallelworkers.h:123
int qt_metacall(QMetaObject::Call _c, int _id, void **_a) override
Definition parallelworkers.h:172
void deactivate(WorkerObject::DeactivatingMode mode=WorkerObject::FlushSignals)
Definition parallelworkers.h:187
const QMetaObject * mocMetaObject() const override
Definition parallelworkers.h:152
StaticMetacallFunction staticMetacallPointer() override
Definition parallelworkers.h:162
~ParallelAdapter() override=default
bool connect(const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type=Qt::AutoConnection) const
Definition parallelworkers.h:197
void wait()
Definition parallelworkers.h:192
QObject * asQObject() override
Definition parallelworkers.h:177
void schedule()
Definition parallelworkers.h:182
static void qt_static_metacall(QObject *o, QMetaObject::Call _c, int _id, void **_a)
Definition parallelworkers.h:157
int WorkerObjectQtMetacall(QMetaObject::Call _c, int _id, void **_a) override
Definition parallelworkers.h:147
const QMetaObject * metaObject() const override
Definition parallelworkers.h:167
void add(A *const worker)
Definition parallelworkers.h:139
Definition parallelworkers.h:30
virtual StaticMetacallFunction staticMetacallPointer()=0
int replacementStaticQtMetacall(QMetaObject::Call _c, int _id, void **_a)
Definition parallelworkers.cpp:142
void(* StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **)
Definition parallelworkers.h:99
virtual QObject * asQObject()=0
void wait()
Definition parallelworkers.cpp:71
void schedule()
Definition parallelworkers.cpp:55
void deactivate(WorkerObject::DeactivatingMode mode=WorkerObject::FlushSignals)
Definition parallelworkers.cpp:63
QList< WorkerObject * > m_workers
Definition parallelworkers.h:104
void add(WorkerObject *const worker)
Definition parallelworkers.cpp:88
int replacementQtMetacall(QMetaObject::Call _c, int _id, void **_a)
Definition parallelworkers.cpp:234
virtual const QMetaObject * mocMetaObject() const =0
virtual int WorkerObjectQtMetacall(QMetaObject::Call _c, int _id, void **_a)=0
bool connect(const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type=Qt::AutoConnection) const
Connects signals outbound from all workers to a given receiver.
Definition parallelworkers.cpp:126
const QMetaObject * replacementMetaObject() const
Definition parallelworkers.cpp:251
Definition workerobject.h:35
DeactivatingMode
Definition workerobject.h:49
@ FlushSignals
Already sent signals are cleared.
Definition workerobject.h:50
Definition datefolderview.cpp:34