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

来源:互联网 发布:python 压力测试工具 编辑:程序博客网 时间:2024/04/30 13:38
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
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
原创粉丝点击