Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递
2019年08月18日起笔
方式一:继承QThread重写run函数
MyThread.h
-----------------------------------
...
class MyThread : public QThread
{
protected:
void run();
} MyThread.cpp
-----------------------------------
...
void MyThread::run()
{
//do something
...
exec();
} Main.cpp
------------------------------------
...
MyThread * myThread = new MyThread;
MyThread.start();
...
方式二:继承QObject并moveToThread
MyWork.h
--------------------------------------
class MyWork : public QObject
{
Q_OBJECT
public:
explict MyWork(QObject * parent = nullptr);
public slots:
void slotsDoWork();
}; MyWork.cpp
--------------------------------------
MyWork::MyWork(QObject *parent):QObject(parent)
{} void MyWork::slotsDoWork()
{
//do something
} someWhere.cpp
--------------------------------------
...
QThread * thread = new QThread(this);
MyWork * myWork = new MyWork;
QObject::connect(thread, &QThread::started, myWork, &MyWork::slotsDoWork);
MyWork->moveToThread(thread); thread->start();
/*
*深入:thread 和 myWork分别在哪个线程中运行? :https://www.cnblogs.com/azbane/p/11465466.html
*/
消息和槽在线程和依附线程间的传递:
首先说明:依附线程是指创建线程的线程。
情况一:线程发射消息,依附线程接收消息
一.1继承QThread重写run函数,小熊尝试失败,针对代码及编译错误消息如下:
MyThread.h
---------------------------------
signals:
void signalsA(); MyThread.cpp
---------------------------------
void MyThread::run()
{
...
emit signalsA();
...
} 编译错误:
---------------------------------
LNK2019:无法解析的外部符号"public: void __thiscall MyThread::signalsA(void)"(?signals@MyThread@@QAEXXZ),该符号在函数 " protected: virtual void __thiscall MyThread::run(void) " (?run@MyThread@@MAEXXZ)中被引用
在run函数中发射消息编译会报错....就不用写关联此信号的槽..了
一.2继承QObject并moveToThread
MyWork.h
------------------------------------
signals:
void signalsA(); MyWork.cpp
------------------------------------
void MyWork::slotsDoWork()
{
...
emit signalsA();
...
} someWhere.cpp
-----------------------------------
QObject::connect(myWork, &MyWork::signalsA, this, &someWhere::slotsToDoSomething);
很顺畅,小熊目前没有发现什么问题。
情况二:依附线程发送消息,线程接收消息
暂未使用到,待补充
Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递的更多相关文章
- Java中实现多线程的两种方式之间的区别
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- 【转】DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...
- 【Python】Python figure显示的两种方式
1. 两种方式: 终端输出图像新窗口输出图像 2. 终端输出命令: %matplotlib inline 新窗口输出命令: %matplotlib qt5 注意此两个语句是命令行输入,若在spyder ...
- centos安装图形界面通常有两种方式
centos安装图形界面通常有两种方式 1.通过系统安装,在配置选择软件界面,选择GNOME桌面模式.
- Struts2实现ajax的两种方式
基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...
- CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)
CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...
- 两种方式实现java生成Excel
Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- 设置a标签,实现点击跳转页面的两种效果
设置a标签,实现点击跳转页面 这个问题,主要是设置a标签的属性target,下面对target属性进行描述: 跳转在同一个窗口 1,target="_self", 它使得目标文档 ...
- mysql时间戳转日期
-- 日期字符串转时间戳,10位,数据库存储的是13位 select UNIX_TIMESTAMP('2019-09-01 00:00:00'); -- 时间戳转日期 ,'%Y-%m-%d %H:%i ...
- Kafka学习笔记之Kafka背景及架构介绍
0x00 概述 本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Producer消息路由,Consumer Group以及由其实现的不 ...
- win10系统本地iis或nginx服务器部署vue.js项目
1.前端框架一般依赖node.js,我们首先要安装node.js.请参考: http://www.cnblogs.com/wuac/p/6381819.html to:安装好node.js后npm也安 ...
- NetCoreApi框架搭建三、JWT授权验证)
1.首先还是粘贴大神的链接 虽然说大神的博客已经讲得很详细了,但是此处还是自己动手好点. 首先配置Startup Swagger的验证 2.新建一个项目存放tokenmodel和生成token并且存入 ...
- 通用高效字符串匹配--Sunday算法
字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...
- ansible简易使用
一.本地环境: centos 7 192.168.10.10 主控机 centos 7 192.168.10.130 被控机 Windows7 192.168.10.13 ...
- Java中的集合类(List,Set.Map)
1.List 1.1 Arraylist 与 LinkedList 区别 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 底层数据结构: Arr ...
- LIBRARY_PATH和LD_LIBRARY_PATH
LIBRARY_PATH是编译时指定的路径. LD_LIBRARY_PATH是运行时指定的动态链接库所在目录. 在运行一个可执行文件之前,可以通过ldd a.exe命令查看a.exe所依赖的动态链接库 ...
- 用chrome的snippets片段功能创建页面js外挂程序,从控制台创建js小脚本
用chrome的snippets片段功能创建页面js外挂程序,从控制台创建js小脚本 Chrome的snippets是小脚本,还可以创作并在Chrome DevTools的来源面板中执行.可以访问和从 ...