24#include <dtkcore_global.h>
28#include <QCoreApplication>
34namespace DThreadUtil {
35typedef std::function<void()> FunctionType;
43 static void proxyCall(QSemaphore *s, QThread *thread, QObject *target, FunctionType fun);
46 void callInLiveThread(QSemaphore *s, QPointer<QObject> target, FunctionType *func);
49template <
typename ReturnType>
50class LIBDTKCORESHARED_EXPORT
_TMP
53 inline static ReturnType runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function<ReturnType()> fun)
56 FunctionType proxyFun = [&result, &fun] () {
60 FunctionCallProxy::proxyCall(s, thread, target, proxyFun);
65 inline static typename std::enable_if<!std::is_base_of<QObject, T>::value, ReturnType>::type
66 runInThread(QSemaphore *s, QThread *thread, T *, std::function<ReturnType()> fun)
68 return runInThread(s, thread,
static_cast<QObject*
>(
nullptr), fun);
72class LIBDTKCORESHARED_EXPORT
_TMP<void>
75 inline static void runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function<
void()> fun)
77 FunctionCallProxy::proxyCall(s, thread, target, fun);
81 inline static typename std::enable_if<!std::is_base_of<QObject, T>::value,
void>::type
82 runInThread(QSemaphore *s, QThread *thread, T *, std::function<
void()> fun)
84 return runInThread(s, thread,
static_cast<QObject*
>(
nullptr), fun);
88template <
typename Fun,
typename... Args>
89inline auto runInThread(QSemaphore *s, QThread *thread, QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
91 return _TMP<
decltype(fun(args...))>::runInThread(s, thread, target, std::bind(fun, std::forward<Args>(args)...));
93template <
typename Fun,
typename... Args>
94inline auto runInThread(QSemaphore *s, QThread *thread, Fun fun, Args&&... args) ->
decltype(fun(args...))
96 return runInThread(s, thread,
nullptr, fun, std::forward<Args>(args)...);
98template <
typename Fun,
typename... Args>
99inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
100 runInThread(QSemaphore *s, QThread *thread, QObject *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
102 return _TMP<typename QtPrivate::FunctionPointer<Fun>::ReturnType>::runInThread(s, thread, target, std::bind(fun, obj, std::forward<Args>(args)...));
104template <
typename Fun,
typename... Args>
105inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
106 runInThread(QSemaphore *s, QThread *thread,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
108 return _TMP<typename QtPrivate::FunctionPointer<Fun>::ReturnType>::runInThread(s, thread, obj, std::bind(fun, obj, std::forward<Args>(args)...));
111template <
typename Fun,
typename... Args>
112inline auto runInThread(QThread *thread, QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
116 return runInThread(&s, thread, target, fun, std::forward<Args>(args)...);
118template <
typename Fun,
typename... Args>
119inline auto runInThread(QThread *thread, Fun fun, Args&&... args) ->
decltype(fun(args...))
121 return runInThread(thread,
nullptr, fun, std::forward<Args>(args)...);
123template <
typename T,
typename Fun,
typename... Args>
124inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
125 runInThread(QThread *thread, T *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
129 return runInThread(&s, thread, target, obj, fun, std::forward<Args>(args)...);
132template <
typename Fun,
typename... Args>
133inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
134 runInThread(QThread *thread,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
136 return runInThread(thread, obj, obj, fun, std::forward<Args>(args)...);
139template <
typename Fun,
typename... Args>
140inline auto runInMainThread(QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
142 if (!QCoreApplication::instance()) {
143 return fun(std::forward<Args>(args)...);
146 return runInThread(QCoreApplication::instance()->thread(), target, fun, std::forward<Args>(args)...);
148template <
typename Fun,
typename... Args>
149inline auto runInMainThread(Fun fun, Args&&... args) ->
decltype(fun(args...))
151 return runInMainThread(
nullptr, fun, std::forward<Args>(args)...);
154template <
typename T,
typename Fun,
typename... Args>
155inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
156 runInMainThread(T *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
158 if (!QCoreApplication::instance()) {
159 return (obj->*fun)(std::forward<Args>(args)...);
162 return runInThread(QCoreApplication::instance()->thread(), target, obj, fun, std::forward<Args>(args)...);
164template <
typename Fun,
typename... Args>
165inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
166 runInMainThread(
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
168 return runInMainThread(obj, obj, fun, std::forward<Args>(args)...);
Definition: dthreadutils.h:38
Definition: dthreadutils.h:51