事件分发

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值