mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-13 20:39:57 +01:00
Allow Closures to be created when running in a different thread from the receiver
This commit is contained in:
parent
70aa98753b
commit
9d6b5e60fc
@ -17,9 +17,15 @@
|
||||
*/
|
||||
|
||||
#include "Closure.h"
|
||||
#include <QApplication>
|
||||
|
||||
namespace _detail {
|
||||
|
||||
static bool on_this_thread(QObject* obj)
|
||||
{
|
||||
return QCoreApplication::instance()->thread() == obj->thread();
|
||||
}
|
||||
|
||||
Closure::Closure(QObject* sender,
|
||||
const char* signal,
|
||||
QObject* receiver,
|
||||
@ -28,9 +34,10 @@ Closure::Closure(QObject* sender,
|
||||
const ClosureArgumentWrapper* val1,
|
||||
const ClosureArgumentWrapper* val2,
|
||||
const ClosureArgumentWrapper* val3)
|
||||
: QObject(receiver),
|
||||
: QObject(on_this_thread(receiver) ? receiver : 0),
|
||||
callback_(NULL),
|
||||
autoDelete_(true),
|
||||
outOfThreadReceiver_(on_this_thread(receiver) ? 0 : receiver ),
|
||||
val0_(val0),
|
||||
val1_(val1),
|
||||
val2_(val2),
|
||||
@ -78,7 +85,7 @@ void Closure::Invoked() {
|
||||
callback_();
|
||||
} else {
|
||||
slot_.invoke(
|
||||
parent(),
|
||||
parent() ? parent() : outOfThreadReceiver_,
|
||||
val0_ ? val0_->arg() : QGenericArgument(),
|
||||
val1_ ? val1_->arg() : QGenericArgument(),
|
||||
val2_ ? val2_->arg() : QGenericArgument(),
|
||||
|
@ -89,6 +89,7 @@ class DLLEXPORT Closure : public QObject, boost::noncopyable {
|
||||
QMetaMethod slot_;
|
||||
std::tr1::function<void()> callback_;
|
||||
bool autoDelete_;
|
||||
QObject* outOfThreadReceiver_;
|
||||
|
||||
boost::scoped_ptr<const ClosureArgumentWrapper> val0_;
|
||||
boost::scoped_ptr<const ClosureArgumentWrapper> val1_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user