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项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- RabbitMQ 在Windows环境下安装
1. 下载RabbitMQ和Erlang RabbitMQ下载地址 https://www.rabbitmq.com/install-windows.html RabbitMQ是用Erlang编程语 ...
- nginx 配置反向代理,负载均衡实战解析
前言:NGINX的反向代理和负载均衡是网站架构中经常用到的一种高并发,高可用的方案,下面我们直接实战操作,当然理论也是要的. 一.反向代理 过程:反向代理:客户端 一>代理 <一> ...
- C++初探
//string1.cpp #include <iostream> int main() { using namespace std; ]={'d','o','g'}//这是char数组, ...
- vue中操作localstorage
首先在子组件将localstorage方法进行封装 在父组件中对其进行引用 将输入的值存入到定义的searchHistory数组中,存储localstorage需要传两个参数,变量名为searchHi ...
- 阿里云 centos 无法执行moodle cron
在阿里云服务器安装moodle时,在执行cron计划任务时,报错sendmail: fatal: parameter inet_interfaces: no local interface found ...
- vue多个路由使用同一个页面,通过name判断参数,渲染页面数据
项目中,发现有多个页面的数据内容相同,只是请求数据的参数不同,就可以使用同一个组件来渲染 这里的客户列表 / 我负责的 / 我参与的 都使用同一个组件,不同点在请求数据的参数 可以看到,通过钩子函数, ...
- VUE-v-if和v-else的使用
1.v-if和v-else <h2 v-if="true">v-if</h2> <h2 v-else>v-else</h2> 注:v ...
- docker 网络模式 和 端口映射
docker 的 网络模式 docker 自带 3 种 网络模式:分别是bridge网络,host网络,none网络,可以使用 docker network ls 命令查看. 1.none网络 这 ...
- Magic Master(2019年南昌网络赛E题+约瑟夫环)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...
- CSS伪类选择器:is、not
本文介绍一下Css伪类:is和:not,并解释一下is.not.matches.any之前的关系 :not The :not() CSS pseudo-class represents element ...