#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QEvent>
#include
#define METHOD_EVENT QEvent::User + 1028
class BaseEvent: public QEvent
{
public:
BaseEvent() : QEvent(QEvent::Type(METHOD_EVENT)){}
~BaseEvent(){}
virtual DoSomeThing(){}
};
class MyThread : public QThread
{
public:
MyThread() : m_pObject(0){}
virtual ~MyThread()
{
StopThread();
}
public:
bool StartThread()
{
start();
return 0 != m_pObject;
}
void StopThread()
{
exit();
wait();
}
bool PushEvent(BaseEvent* pEvent)
{
if (NULL == pEvent) return false;
if (m_pObject)
{
QCoreApplication::postEvent(m_pObject, pEvent);
/*
QCoreApplication::sendEvent(m_pObject, pEvent);//发给工作线程,并阻塞等待
QCoreApplication::postEvent(m_pObject, pEvent);//发给工作线程,非阻塞等待
*/
}
else
{
delete pEvent;
}
return true;
}
private:
virtual void run()
{
if (0 == m_pObject)
{
m_pObject = new ThreadObject(this);
}
exec();
if (m_pObject)
{
delete m_pObject;
m_pObject = 0;
}
}
private:
class ThreadObject;
ThreadObject* m_pObject;
class ThreadObject : public QObject
{
public:
ThreadObject(MyThread* pThread) : m_pThread(pThread){}
virtual ~ThreadObject(){}
virtual void customEvent(QEvent * event)
{
if (NULL == event || METHOD_EVENT != event->type()) return;
BaseEvent* pEvent = (BaseEvent*)(event);
if (pEvent)
{
pEvent->DoSomeThing();
}
}
private:
MyThread* m_pThread;
};
};
class Clock : public QObject
{
Q_OBJECT
public:
Clock(MyThread* pThread) : m_pThread(pThread){}
public slots:
void OnTimer()
{
BaseEvent* pEvent = new BaseEvent();//新建一个任务
m_pThread->PushEvent(pEvent);
}
private:
MyThread* m_pThread;
};
#endif // MYTHREAD_H
下面是主函数
#include "mythread.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyThread mythread;
mythread.StartThread();//启动辅助线程,
Clock* clocker = new Clock(&mythread);
QTimer *timer = new QTimer();
QObject::connect(timer, SIGNAL(timeout()), clocker, SLOT(OnTimer()));
timer->start(5000);
return a.exec();
}