Blob Blame Raw


#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());
}

//------------------------------------------------------------------------------