zoukankan      html  css  js  c++  java
  • 基于QT4的一个多线程工程实现

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://easons.blogbus.com/logs/14845035.html

    下面的例子有问题,导致全部事件都是在创建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上了。


    收藏到:Del.icio.us
  • 相关阅读:
    lseek 与 ioctl
    perror表
    阻塞&&非阻塞
    linux read/write
    文件i/o函数 open/close
    linux 文件io
    linux下的静态库和共享库
    linux基本命令
    c++ 2.1 编译器何时创建默认构造函数
    Java学习笔记34(sql基础 :增删改查1)
  • 原文地址:https://www.cnblogs.com/whisht/p/2486422.html
Copyright © 2011-2022 走看看