现在的位置: 首页 > 综合 > 正文

基于QT4的一个多线程工程实现

2013年10月06日 ⁄ 综合 ⁄ 共 1563字 ⁄ 字号 评论关闭
  • 基于QT4的一个多线程工程实现

    下面的例子有问题,导致全部事件都是在创建Thread的线程里处理的,

    正确例子在:
    http://easons.blogbus.com/logs/30443107.html

    想法:需要模仿ACE异步调用的方法,在一个线程分配任务给工作线程,并等待工作线程完成后返回结果。 

    定义一个线程类:

    头文件: 

    #ifndef MYTHREAD_H
    #define MYTHREAD_H

    #include <QThread>
    #include <QEvent>

    #define METHOD_EVENT QEvent::User + 1028

    class MethodEvent : public QEvent
    {
    public:
     MethodEvent() : QEvent(QEvent::Type(METHOD_EVENT))
     {
     }
     ~MethodEvent()
     {
     }
    public:
     int i;//存储返回值!
    };

    class MyThread : public QThread
    {
     Q_OBJECT

    public:
     MyThread();
     ~MyThread();
     bool StartThread();
     bool StopThread();
    protected:
     void run();
     void customEvent(QEvent * e);
     
    };

    #endif // MYTHREAD_H

    实现文件: 

    #include "mythread.h"

    MyThread::MyThread()
    {

    }

    MyThread::~MyThread()
    {

    }

    bool MyThread::StartThread()
    {
     start();//线程启动,调用run
     return true;
    }

    bool MyThread::StopThread()
    {
     exit();
     return false;
    }

    void MyThread::run()
    {
     exec();//进入本线程的消息循环
    }

    void MyThread::customEvent(QEvent * e)
    {
     if(0 == e)
      return;
     if( METHOD_EVENT != e->type() )
     {
      return;
     }

     MethodEvent* methodEvent = static_cast<MethodEvent*>(e);

     if(NULL == methodEvent)
      return;

     for (int i = 0; i < 1000000000; ++i)
     {
      methodEvent->i = i;
     }
    }

    主函数:

    #include <QtCore/QCoreApplication>
    #include "mythread.h"

    int main(int argc, char *argv[])
    {
     QCoreApplication a(argc, argv);
     MyThread mythread;
     mythread.StartThread();//启动辅助线程,

     MethodEvent event;//新建一个任务
     QCoreApplication::sendEvent(&mythread, &event);//发给工作线程,并阻塞等待

     int result = event.i;//得到返回值。
     return a.exec();
    }

    说明:如果不用到返回值,也就是只是简单分配任务的话,可以用postEvent的方法,也就是要new一个event,发给工作线程,工作线程处理完事件后会去删除你new的event,主线程就不管了。换句话说,postEvent马上返回,不管event是否被处理完,两个线程同时在工作。而上面是主线程要等待工作线程完成工作后才可以继续,阻塞在sendEvent上了。

 

 

 

         分享:http://easons.blogbus.com/logs/14845035.html

抱歉!评论已关闭.