#include "tthreadmessage.h" #include "tthreadp.h" #include QThread *MainThread = QThread::currentThread(); TThreadMessageDispatcher *Dispatcher; // MUST BE CREATED in the main thread!!!!!! //------------------------------------------------------------------------------ bool TThread::isMainThread() { return MainThread == QThread::currentThread(); } //------------------------------------------------------------------------------ TThreadMessageDispatcher::TThreadMessageDispatcher() { connect(this, SIGNAL(signaled(TThread::Message *)), this, SLOT(onSignal(TThread::Message *))); connect(this, SIGNAL(blockingSignaled(TThread::Message *)), this, SLOT(onSignal(TThread::Message *)), Qt::BlockingQueuedConnection); } //------------------------------------------------------------------------------ void TThreadMessageDispatcher::init() { if (!TThread::isMainThread()) return; if (Dispatcher == 0) Dispatcher = new TThreadMessageDispatcher(); } //------------------------------------------------------------------------------ TThreadMessageDispatcher *TThreadMessageDispatcher::instance() { assert(Dispatcher); return Dispatcher; } //------------------------------------------------------------------------------ void TThreadMessageDispatcher::emitSignaled(TThread::Message *msg) { Q_EMIT signaled(msg); } //------------------------------------------------------------------------------ void TThreadMessageDispatcher::emitBlockingSignaled(TThread::Message *msg) { Q_EMIT blockingSignaled(msg); } //------------------------------------------------------------------------------ void TThreadMessageDispatcher::onSignal(TThread::Message *msg) { msg->onDeliver(); delete msg; } //------------------------------------------------------------------------------ TThread::Message::Message() {} //------------------------------------------------------------------------------ void TThread::Message::send() { if (isMainThread()) onDeliver(); else TThreadMessageDispatcher::instance()->emitSignaled(clone()); } //------------------------------------------------------------------------------ void TThread::Message::sendBlocking() { if (isMainThread()) onDeliver(); else TThreadMessageDispatcher::instance()->emitBlockingSignaled(clone()); } //------------------------------------------------------------------------------