⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qt事件案例.txt

📁 给想用QT进行网络编程的朋友们收集到的一些资料
💻 TXT
字号:

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

 想法:需要模仿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上了。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -