From 68f557434a089b4eecd682397cc63bcd26a259f7 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 2 May 2013 17:03:49 -0500 Subject: [PATCH] Automated update from Qt3 --- src/kernel/ntqobject.h | 1 + src/kernel/qobject.cpp | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/kernel/ntqobject.h b/src/kernel/ntqobject.h index 943e8319..781697ce 100644 --- a/src/kernel/ntqobject.h +++ b/src/kernel/ntqobject.h @@ -226,6 +226,7 @@ public: #ifdef QT_THREAD_SUPPORT TQThread* contextThreadObject() const; void moveToThread(TQThread *targetThread); + void disableThreadPostedEvents(bool disable); #endif private: diff --git a/src/kernel/qobject.cpp b/src/kernel/qobject.cpp index 16c9b23e..2e384376 100644 --- a/src/kernel/qobject.cpp +++ b/src/kernel/qobject.cpp @@ -66,9 +66,14 @@ class TQObjectPrivate { { public: #ifndef QT_NO_USERDATA - TQObjectPrivate( uint s ) : TQPtrVector(s){ setAutoDelete( TRUE ); } + TQObjectPrivate( uint s ) : TQPtrVector(s) { + ownThread = NULL; + disableThreadPostedEvents = false; + setAutoDelete( TRUE ); + } #endif TQThread* ownThread; + bool disableThreadPostedEvents; }; #if defined(QT_THREAD_SUPPORT) @@ -151,6 +156,25 @@ void TQObject::moveToThread(TQThread *targetThread) setThreadObject_helper(targetThread); } +/*! + Changes the way cross thread signals are handled + If disable is FALSE, signals emitted from one thread will be + posted to any other connected threads' event loops (default). + + If disable is TRUE, calls to emit from one thread + will immediately execute slots in another thread. + This mode of operation is inherently unsafe and is provided + solely to support thread management by a third party application. + */ +void TQObject::disableThreadPostedEvents(bool disable) { + if ( !d ) { + d = new TQObjectPrivate(0); + } + + d->ownThread = TQThread::currentThreadObject(); + d->disableThreadPostedEvents = disable; +} + #endif class TQSenderObjectList : public TQObjectList, public TQShared @@ -957,7 +981,7 @@ bool TQObject::event( TQEvent *e ) { TQMetaCallEvent* metaEvent = dynamic_cast(e); if (metaEvent) { - if (d->ownThread == TQThread::currentThreadObject()) { + if ((d->disableThreadPostedEvents) || (d->ownThread == TQThread::currentThreadObject())) { TQSenderObjectList* sol; TQObject* oldSender = 0; sol = senderObjects; @@ -2592,7 +2616,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) sol->currentSender = this; } if ( c->memberType() == TQSIGNAL_CODE ) { - if (object->d->ownThread == currentThread) { + if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) { object->tqt_emit( c->member(), o ); } else { @@ -2602,7 +2626,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) } } else { - if (object->d->ownThread == currentThread) { + if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) { object->tqt_invoke( c->member(), o ); } else { @@ -2632,7 +2656,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) sol->currentSender = this; } if ( c->memberType() == TQSIGNAL_CODE ) { - if (object->d->ownThread == currentThread) { + if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) { object->tqt_emit( c->member(), o ); } else { @@ -2642,7 +2666,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) } } else { - if (object->d->ownThread == currentThread) { + if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) { object->tqt_invoke( c->member(), o ); } else {