92 lines
2.3 KiB
C++
92 lines
2.3 KiB
C++
|
|
||
|
|
||
|
#include "tthreadmessage.h"
|
||
|
#include "tthreadp.h"
|
||
|
#include <QThread>
|
||
|
|
||
|
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());
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|