MythTV master
mconcurrent.h
Go to the documentation of this file.
1#ifndef MCONCURRENT_H
2#define MCONCURRENT_H
3
6
7
28namespace MConcurrent {
29
30class RunFunctionTask : public QRunnable
31{
32public:
33 void start(const QString &name)
34 {
35 MThreadPool::globalInstance()->start(this, name, /*m_priority*/ 0);
36 }
37
38 virtual void runFunctor() = 0;
39
40 void run() override
41 {
42 try
43 {
44 this->runFunctor();
45 }
46 catch (...)
47 {
48 LOG(VB_GENERAL, LOG_ERR, "An exception occurred");
49 }
50 }
51};
52
53template <typename Class>
55{
56public:
57 VoidStoredMemberFunctionPointerCall0(void (Class::*fn)() , Class *object)
58 : m_fn(fn), m_object(object) { }
59
60 void runFunctor() override { (m_object->*m_fn)(); }
61private:
62 void (Class::*m_fn)();
63 Class *m_object;
64};
65
66template <typename Class, typename Param1, typename Arg1>
68{
69public:
70 VoidStoredMemberFunctionPointerCall1(void (Class::*fn)(Param1) , Class *object, const Arg1 &arg1)
71 : m_fn(fn), m_object(object), m_arg1(arg1){ }
72
73 void runFunctor() override { (m_object->*m_fn)(m_arg1); }
74private:
75 void (Class::*m_fn)(Param1);
76 Class *m_object;
77 Arg1 m_arg1;
78};
79
80template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
82{
83public:
84 VoidStoredMemberFunctionPointerCall2(void (Class::*fn)(Param1, Param2) , Class *object, const Arg1 &arg1, const Arg2 &arg2)
85 : m_fn(fn), m_object(object), m_arg1(arg1), m_arg2(arg2){ }
86
87 void runFunctor() override { (m_object->*m_fn)(m_arg1, m_arg2); }
88private:
89 void (Class::*m_fn)(Param1, Param2);
90 Class *m_object;
91 Arg1 m_arg1; Arg2 m_arg2;
92};
93
94template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
96{
97public:
98 VoidStoredMemberFunctionPointerCall3(void (Class::*fn)(Param1, Param2, Param3) , Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
99 : m_fn(fn), m_object(object), m_arg1(arg1), m_arg2(arg2), m_arg3(arg3){ }
100
101 void runFunctor() override { (m_object->*m_fn)(m_arg1, m_arg2, m_arg3); }
102private:
103 void (Class::*m_fn)(Param1, Param2, Param3);
104 Class *m_object;
105 Arg1 m_arg1; Arg2 m_arg2; Arg3 m_arg3;
106};
107
108template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
110{
111public:
112 VoidStoredMemberFunctionPointerCall4(void (Class::*fn)(Param1, Param2, Param3, Param4) , Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
113 : m_fn(fn), m_object(object), m_arg1(arg1), m_arg2(arg2), m_arg3(arg3), m_arg4(arg4){ }
114
115 void runFunctor() override { (m_object->*m_fn)(m_arg1, m_arg2, m_arg3, m_arg4); }
116private:
117 void (Class::*m_fn)(Param1, Param2, Param3, Param4);
118 Class *m_object;
119 Arg1 m_arg1; Arg2 m_arg2; Arg3 m_arg3; Arg4 m_arg4;
120};
121
122template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
124{
125public:
126 VoidStoredMemberFunctionPointerCall5(void (Class::*fn)(Param1, Param2, Param3, Param4, Param5) , Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
127 : m_fn(fn), m_object(object), m_arg1(arg1), m_arg2(arg2), m_arg3(arg3), m_arg4(arg4), m_arg5(arg5){ }
128
129 void runFunctor() override { (m_object->*m_fn)(m_arg1, m_arg2, m_arg3, m_arg4, m_arg5); }
130private:
131 void (Class::*m_fn)(Param1, Param2, Param3, Param4, Param5);
132 Class *m_object;
133 Arg1 m_arg1; Arg2 m_arg2; Arg3 m_arg3; Arg4 m_arg4; Arg5 m_arg5;
134};
135
136template <typename Class>
137void run(const QString &name, Class *object, void (Class::*fn)())
138{
139 (new VoidStoredMemberFunctionPointerCall0<Class>(fn, object))->start(name);
140}
141
142template <typename Class, typename Param1, typename Arg1>
143void run(const QString &name, Class *object, void (Class::*fn)(Param1), const Arg1 &arg1)
144{
145 (new VoidStoredMemberFunctionPointerCall1<Class, Param1, Arg1>(fn, object, arg1))->start(name);
146}
147
148template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2>
149void run(const QString &name, Class *object, void (Class::*fn)(Param1, Param2), const Arg1 &arg1, const Arg2 &arg2)
150{
151 (new VoidStoredMemberFunctionPointerCall2<Class, Param1, Arg1, Param2, Arg2>(fn, object, arg1, arg2))->start(name);
152}
153
154template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3>
155void run(const QString &name, Class *object, void (Class::*fn)(Param1, Param2, Param3), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
156{
158}
159
160template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4>
161void run(const QString &name, Class *object, void (Class::*fn)(Param1, Param2, Param3, Param4), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
162{
164}
165
166template <typename Class, typename Param1, typename Arg1, typename Param2, typename Arg2, typename Param3, typename Arg3, typename Param4, typename Arg4, typename Param5, typename Arg5>
167void run(const QString &name, Class *object, void (Class::*fn)(Param1, Param2, Param3, Param4, Param5), const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg4 &arg5)
168{
170}
171
172
173} //namespace QtConcurrent
174
175#endif // MCONCURRENT_H
void start(const QString &name)
Definition: mconcurrent.h:33
virtual void runFunctor()=0
VoidStoredMemberFunctionPointerCall0(void(Class::*fn)(), Class *object)
Definition: mconcurrent.h:57
VoidStoredMemberFunctionPointerCall1(void(Class::*fn)(Param1), Class *object, const Arg1 &arg1)
Definition: mconcurrent.h:70
VoidStoredMemberFunctionPointerCall2(void(Class::*fn)(Param1, Param2), Class *object, const Arg1 &arg1, const Arg2 &arg2)
Definition: mconcurrent.h:84
void(Class::* m_fn)(Param1, Param2, Param3)
Definition: mconcurrent.h:103
VoidStoredMemberFunctionPointerCall3(void(Class::*fn)(Param1, Param2, Param3), Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
Definition: mconcurrent.h:98
void(Class::* m_fn)(Param1, Param2, Param3, Param4)
Definition: mconcurrent.h:117
VoidStoredMemberFunctionPointerCall4(void(Class::*fn)(Param1, Param2, Param3, Param4), Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
Definition: mconcurrent.h:112
void(Class::* m_fn)(Param1, Param2, Param3, Param4, Param5)
Definition: mconcurrent.h:131
VoidStoredMemberFunctionPointerCall5(void(Class::*fn)(Param1, Param2, Param3, Param4, Param5), Class *object, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
Definition: mconcurrent.h:126
static MThreadPool * globalInstance(void)
void start(QRunnable *runnable, const QString &debugName, int priority=0)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
Provides a simple version of QtConcurrent::run() that uses MThreadPool rather than QThreadPool.
Definition: mconcurrent.h:28
void run(const QString &name, Class *object, void(Class::*fn)())
Definition: mconcurrent.h:137