Qt线程间通信-自定义事件
线程间通信:
1.自定义事件:postEvent();
2.信号与槽【本质也是通过自定义事件实现的】
注意:每个线程都有自己的事件循环
自定义事件:
1.从QEvent继承;
2.registerEventType();//会返回全局唯一的事件类型
3.QCoreApplication::postEvent();//异步方式发送事件,Qt本身接管事件周期,在事件处理后就会销毁他,所以new了后不要delete!!!!注意了new了后可以不delete!!!
4.重写event方法;//接收的那一方重写event
线程间通信:
1.使用自定义事件在线程通信;
2.可携带自定义数据;
3.逻辑清晰不易混乱;
程序运行截图如下:
代码如下:
customevent.h
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H#include <QEvent>
#include <QString>class CustomEvent:public QEvent
{
public:CustomEvent(const QString &msg);static QEvent::Type evType();static QEvent::Type m_eventType;QString m_msg;
};#endif // CUSTOMEVENT_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "customevent.h"
#include <QLabel>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();bool event(QEvent *e);protected:QLabel *m_label;
};#endif // WIDGET_H
customevent.cpp
#include "customevent.h"QEvent::Type CustomEvent::m_eventType=(QEvent::Type)registerEventType();CustomEvent::CustomEvent(const QString &msg):QEvent(evType()),m_msg(msg)
{}QEvent::Type CustomEvent::evType(){return m_eventType;
}
main.cpp
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
widget.cpp
#include "widget.h"
#include <QEvent>
#include <QTimer>
#include <QDateTime>
#include <QCoreApplication>
#include <QThread>class SimpleThread:public QThread{
public:SimpleThread(QObject *receiver):m_receiver(receiver){}void run(){while(1){QThread::msleep(1000);CustomEvent *ce=new CustomEvent(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));QCoreApplication::postEvent(m_receiver,ce);}}QObject *m_receiver;
};Widget::Widget(QWidget *parent): QWidget(parent)
{m_label=new QLabel(this);SimpleThread *t=new SimpleThread(this);t->start();
}Widget::~Widget()
{}bool Widget::event(QEvent *e)
{if(e->type()==CustomEvent::evType()){CustomEvent *ce=(CustomEvent*)e;m_label->setText(ce->m_msg);m_label->adjustSize();e->accept();return true;}return QWidget::event(e);
}
Qt线程间通信-自定义事件相关推荐
- Qt线程间通信-信号与槽通信
线程间通信: 1.自定义事件:postEvent(): 2.信号与槽[本质也是通过自定义事件实现的] 注意:每个线程都有自己的事件循环 下面先说明下信号与槽的通信: 下面这个程序的运行截图 模拟下载! ...
- Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...
- python线程间通信_python多线程之事件触发(线程间通信)
执行结果: 那么,通过分析执行结果来看,您已经体会到了其中的秘密.... 再脑补一下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信 ...
- android线程间通信的几种方法_Android 技能图谱学习路线
Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashC ...
- 进程间通信线程间通信
一.多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进 ...
- 进程间通信和线程间通信
进程间通信 转自 https://www.cnblogs.com/LUO77/p/5816326.html 线程间通信 https://www.cnblogs.com/jobs1/p/107840 ...
- android java 线程通信_Android 线程间通信
进程与线程的区别? 在Android中,线程是跑在进程之中的,当手机打开一个APP就相当于打开了一个进程,比如:UI界面的更新,就是在主线程中完成的,我也可以自定义一些子线程来完成所需要的任务. 如何 ...
- 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )
文章目录 一.进程与线程 二.并发 三.线程间通信 四.Java 并发 3 特性 一.进程与线程 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交 ...
- Net线程间通信的异步机制
线程间通信 我们看下面的图 图1 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context ...
最新文章
- 15-shell 输入/输出重定向
- Naveen Tewari先生荣获艾奇奖“年度商业创新领袖人物”
- 基于VTK与Qt的体绘制程序
- Element Swapping
- GLSL三种修饰符区别与用途(uniform,attribute和varying)
- Primes on Interval
- java native 接口_Java本地接口--Java Native Interface (JNI)
- Eclipse中导入Java项目出现“No projects are found to import”
- LDA主题模型(算法详解)
- switchhost提示没有切换权限
- 二、8086汇编命令大全
- 总结2020:5个月出版两本书,日更公众号是一种怎样的体验?
- 计算机为什么选择二进制?
- JavaEE项目的三层架构
- 使用Hexo 在本地搭建博客(一)
- 我用css精灵图拼接了自己的英文名字,不会还有人不知道精灵图技术吧?
- SoftMaker Office 2021中文版软件介绍-Office办公套件媲美Microsoft Office
- python-18-并行计算pp模块
- windows10桌面计算机图标删除吗,win10电脑桌面图标删除不了怎么办
- 手握千亿美金的孙正义,这次真的不能如愿了