1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/* ============================================================
*
* This file is a part of KDE project
*
*
* Date : 2011-12-28
* Description : Low level threads management for batch processing on multi-core
*
* Copyright (C) 2014 by Veaceslav Munteanu <veaceslav dot munteanu90 at gmail dot com>
* Copyright (C) 2011-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
* Copyright (C) 2011-2012 by A Janardhan Reddy <annapareddyjanardhanreddy at gmail dot com>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation;
* either version 2, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* ============================================================ */
#ifndef KP_THREAD_MNGR_H
#define KP_THREAD_MNGR_H
// Qt includes
#include <QThread>
#include <QRunnable>
#include <QObject>
// Local includes
#include "kipiplugins_export.h"
namespace KIPIPlugins
{
class KIPIPLUGINS_EXPORT KPJob : public QObject,
public QRunnable
{
Q_OBJECT
public:
/** Constructor which delegate deletion of QRunnable instance to KPThreadManager, not QThreadPool.
*/
KPJob();
/** Re-implement destructor in you implementation. Don't forget to cancel job.
*/
virtual ~KPJob();
Q_SIGNALS:
/** Use this signal in your implementation to inform KPThreadManager manager that job is started
*/
void signalStarted();
/** Use this signal in your implementation to inform KPThreadManager manager the job progress
*/
void signalProgress(int);
/** Use this signal in your implementation to inform KPThreadManager manager the job is done.
*/
void signalDone();
public Q_SLOTS:
/** Call this method to cancel job.
*/
void cancel();
protected:
/** You can use this boolean in your implementation to know if job must be canceled.
*/
bool m_cancel;
};
/** Define a map of job/priority to process by KPThreadManager manager.
* Priority value can be used to control the run queue's order of execution.
* Zero priority want mean to process job with higher priority.
*/
typedef QMap<KPJob*, int> KPJobCollection;
// -------------------------------------------------------------------------------------------------------
class KIPIPLUGINS_EXPORT KPThreadManager : public QThread
{
Q_OBJECT
public:
KPThreadManager(QObject* const parent=nullptr);
virtual ~KPThreadManager();
/** Adjust maximum number of threads used to parallelize collection of job processing.
*/
void setMaximumNumberOfThreads(int n);
/** Return the maximum number of threads used to parallelize collection of job processing.
*/
int maximumNumberOfThreads() const;
/** Reset maximum number of threads used to parallelize collection of job processing to max core detected on computer.
* This method is called in contructor.
*/
void defaultMaximumNumberOfThreads();
/** Cancel processing of current jobs under progress.
*/
void cancel();
protected:
/** Main thread loop used to process jobs in todo list.
*/
void run() override;
/** Append a collection of jobs to process into QThreadPool.
* Jobs are add to pending lists and will be deleted by KPThreadManager, not QThreadPool.
*/
void appendJobs(const KPJobCollection& jobs);
/** Return true if list of pending jobs to process is empty.
*/
bool isEmpty() const;
protected Q_SLOTS:
void slotJobFinished();
private:
class Private;
Private* const d;
};
} // namespace KIPIPlugins
#endif // KP_THREAD_MNGR_H
|