MythTV master
taskqueue.h
Go to the documentation of this file.
1
2// Program Name: taskqueue.h
3// Created : Oct. 24, 2005
4//
5// Purpose : Used to process delayed tasks
6//
7// Copyright (c) 2005 David Blain <dblain@mythtv.org>
8//
9// Licensed under the GPL v2 or later, see LICENSE for details
10//
12
13#ifndef TASKQUEUE_H
14#define TASKQUEUE_H
15
16// C++ headers
17#include <chrono>
18#include <map>
19
20// Qt headers
21#include <QChar> // Fix Qt6 GCC SFINAE warning
22#include <QMutex>
23#include <QString>
24
25// MythTV headers
26#include "libmythbase/mthread.h"
28
29#include "upnpexp.h"
30
31class Task;
32class TaskQueue;
33
35// Typedefs
37
38using TaskMap = std::multimap<std::chrono::microseconds, Task *>;
39
42//
43// Task Class Definition
44//
47
48class Task : public ReferenceCounter
49{
50 protected:
51 static long m_nTaskCount;
52
54
55 protected:
56
57 // Destructor protected to force use of Release Method
58 ~Task() override = default;
59
60 public:
61
62 explicit Task(const QString &debugName);
63
64 long Id() const { return( m_nTaskId ); }
65
66 virtual void Execute( TaskQueue *pQueue ) = 0;
67 virtual QString Name () = 0;
68
69};
70
71
73// TaskQueue Singleton
75
77{
78 private:
79
80 // Singleton instance used by all.
82
83 protected:
84
86 QMutex m_mutex;
87 bool m_bTermRequested {false};
88
89 protected:
90
92
93 void run() override; // MThread
94
95 private:
96
97 // ------------------------------------------------------------------
98 // Private so the singleton pattern can be inforced.
99 // ------------------------------------------------------------------
100
101 TaskQueue();
102
103 public:
104
105 static TaskQueue* Instance();
106 static void Shutdown();
107
108 ~TaskQueue() override;
109
110 void RequestTerminate ( );
111
112 void Clear ( );
113 void AddTask ( std::chrono::milliseconds msec , Task *pTask );
114 void AddTask ( Task *pTask );
115
116 Task *GetNextExpiredTask ( std::chrono::microseconds tt, std::chrono::milliseconds nWithinMilliSecs = 50ms );
117
118 private:
119 void AddTaskAbsolute ( std::chrono::microseconds tt, Task *pTask );
120};
121
122#endif // TASKQUEUE_H
#define Clear(a)
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
virtual void run(void)
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: mthread.cpp:299
General purpose reference counter.
TaskMap m_mapTasks
Definition: taskqueue.h:85
QMutex m_mutex
Definition: taskqueue.h:86
static TaskQueue * g_pTaskQueue
Definition: taskqueue.h:81
bool IsTermRequested()
Definition: taskqueue.h:49
virtual QString Name()=0
static long m_nTaskCount
Definition: taskqueue.h:51
long m_nTaskId
Definition: taskqueue.h:53
virtual void Execute(TaskQueue *pQueue)=0
~Task() override=default
long Id() const
Definition: taskqueue.h:64
Task(const QString &debugName)
Definition: taskqueue.cpp:39
std::multimap< std::chrono::microseconds, Task * > TaskMap
Definition: taskqueue.h:38
#define UPNP_PUBLIC
Definition: upnpexp.h:9