8#include <dtkcore_global.h>
12#include <QCoreApplication>
18namespace DThreadUtil {
19typedef std::function<void()> FunctionType;
27 static void proxyCall(QSemaphore *s, QThread *thread, QObject *target, FunctionType fun);
30 void callInLiveThread(QSemaphore *s, QPointer<QObject> target, FunctionType *func);
33template <
typename ReturnType>
34class LIBDTKCORESHARED_EXPORT
_TMP
37 inline static ReturnType runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function<ReturnType()> fun)
40 FunctionType proxyFun = [&result, &fun] () {
44 FunctionCallProxy::proxyCall(s, thread, target, proxyFun);
49 inline static typename std::enable_if<!std::is_base_of<QObject, T>::value, ReturnType>::type
50 runInThread(QSemaphore *s, QThread *thread, T *, std::function<ReturnType()> fun)
52 return runInThread(s, thread,
static_cast<QObject*
>(
nullptr), fun);
56class LIBDTKCORESHARED_EXPORT
_TMP<void>
59 inline static void runInThread(QSemaphore *s, QThread *thread, QObject *target, std::function<
void()> fun)
61 FunctionCallProxy::proxyCall(s, thread, target, fun);
65 inline static typename std::enable_if<!std::is_base_of<QObject, T>::value,
void>::type
66 runInThread(QSemaphore *s, QThread *thread, T *, std::function<
void()> fun)
68 return runInThread(s, thread,
static_cast<QObject*
>(
nullptr), fun);
72template <
typename Fun,
typename... Args>
73inline auto runInThread(QSemaphore *s, QThread *thread, QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
75 return _TMP<
decltype(fun(args...))>::runInThread(s, thread, target, std::bind(fun, std::forward<Args>(args)...));
77template <
typename Fun,
typename... Args>
78inline auto runInThread(QSemaphore *s, QThread *thread, Fun fun, Args&&... args) ->
decltype(fun(args...))
80 return runInThread(s, thread,
nullptr, fun, std::forward<Args>(args)...);
82template <
typename Fun,
typename... Args>
83inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
84 runInThread(QSemaphore *s, QThread *thread, QObject *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
86 return _TMP<typename QtPrivate::FunctionPointer<Fun>::ReturnType>::runInThread(s, thread, target, std::bind(fun, obj, std::forward<Args>(args)...));
88template <
typename Fun,
typename... Args>
89inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
90 runInThread(QSemaphore *s, QThread *thread,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
92 return _TMP<typename QtPrivate::FunctionPointer<Fun>::ReturnType>::runInThread(s, thread, obj, std::bind(fun, obj, std::forward<Args>(args)...));
95template <
typename Fun,
typename... Args>
96inline auto runInThread(QThread *thread, QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
100 return runInThread(&s, thread, target, fun, std::forward<Args>(args)...);
102template <
typename Fun,
typename... Args>
103inline auto runInThread(QThread *thread, Fun fun, Args&&... args) ->
decltype(fun(args...))
105 return runInThread(thread,
nullptr, fun, std::forward<Args>(args)...);
107template <
typename T,
typename Fun,
typename... Args>
108inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
109 runInThread(QThread *thread, T *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
113 return runInThread(&s, thread, target, obj, fun, std::forward<Args>(args)...);
116template <
typename Fun,
typename... Args>
117inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
118 runInThread(QThread *thread,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
120 return runInThread(thread, obj, obj, fun, std::forward<Args>(args)...);
123template <
typename Fun,
typename... Args>
124inline auto runInMainThread(QObject *target, Fun fun, Args&&... args) ->
decltype(fun(args...))
126 if (!QCoreApplication::instance()) {
127 return fun(std::forward<Args>(args)...);
130 return runInThread(QCoreApplication::instance()->thread(), target, fun, std::forward<Args>(args)...);
132template <
typename Fun,
typename... Args>
133inline auto runInMainThread(Fun fun, Args&&... args) ->
decltype(fun(args...))
135 return runInMainThread(
nullptr, fun, std::forward<Args>(args)...);
138template <
typename T,
typename Fun,
typename... Args>
139inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
140 runInMainThread(T *target,
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
142 if (!QCoreApplication::instance()) {
143 return (obj->*fun)(std::forward<Args>(args)...);
146 return runInThread(QCoreApplication::instance()->thread(), target, obj, fun, std::forward<Args>(args)...);
148template <
typename Fun,
typename... Args>
149inline typename QtPrivate::FunctionPointer<Fun>::ReturnType
150 runInMainThread(
typename QtPrivate::FunctionPointer<Fun>::Object *obj, Fun fun, Args&&... args)
152 return runInMainThread(obj, obj, fun, std::forward<Args>(args)...);
Definition: dthreadutils.h:22
Definition: dthreadutils.h:35