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
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|