tahoma2d/toonz/sources/common/tcore/threadmessage.cpp

80 lines
2.4 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "tthreadmessage.h"
#include "tthreadp.h"
#include <QThread>
QThread *MainThread = QThread::currentThread();
2016-06-15 18:43:10 +12:00
TThreadMessageDispatcher
*Dispatcher; // MUST BE CREATED in the main thread!!!!!!
2016-03-19 06:57:51 +13:00
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
bool TThread::isMainThread() { return MainThread == QThread::currentThread(); }
2016-03-19 06:57:51 +13:00
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
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);
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThreadMessageDispatcher::init() {
if (!TThread::isMainThread()) return;
if (Dispatcher == 0) Dispatcher = new TThreadMessageDispatcher();
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TThreadMessageDispatcher *TThreadMessageDispatcher::instance() {
assert(Dispatcher);
return Dispatcher;
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThreadMessageDispatcher::emitSignaled(TThread::Message *msg) {
Q_EMIT signaled(msg);
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThreadMessageDispatcher::emitBlockingSignaled(TThread::Message *msg) {
Q_EMIT blockingSignaled(msg);
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThreadMessageDispatcher::onSignal(TThread::Message *msg) {
msg->onDeliver();
delete msg;
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TThread::Message::Message() {}
2016-03-19 06:57:51 +13:00
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThread::Message::send() {
if (isMainThread())
onDeliver();
else
TThreadMessageDispatcher::instance()->emitSignaled(clone());
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TThread::Message::sendBlocking() {
if (isMainThread())
onDeliver();
else
TThreadMessageDispatcher::instance()->emitBlockingSignaled(clone());
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------