Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递
2024-08-21 08:44:40
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);
很顺畅,小熊目前没有发现什么问题。
情况二:依附线程发送消息,线程接收消息
暂未使用到,待补充
最新文章
- 三代PacBio reads纠错 - 专题
- WCF开发框架之插件化应用模式升级
- IOS测试程序运行耗时
- MySQL 及 SQL 注入
- objective-C运算符和表达式
- 最冤枉的关键字----sizeof
- Sql狗血的Bit类型赋值与取值
- IOCP模型与网络编程
- 一个有用的shell脚本
- windows python flask上传文件出现IOError: [Errno 13] Permission denied: 'E:\\git\\test\\static\\uploads'的解决方法
- java.lang.NoClassDefFoundError: org/apache/jsp/jsp/Container_jsp
- Linux 常用命令,处理端口和Tomcat,mysql
- swig模板引擎汇总
- json数据格式 net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of Error:(findColumns1)Read timed out
- [Java]Servlet&;JSP
- SharePoint 列表视图修改多行文本字段显示长度
- mysql中的日期转换函数(类似oracle中的to_date)
- SPOJ ADAFIELD Ada and Field(STL的使用:set,multiset,map的迭代器)题解
- js的let语句在安卓手机端的QQ浏览器出错的问题
- DataStage 错误集(持续更新)
热门文章
- Web应急:门罗币恶意挖矿
- W tensorflow/core/util/ctc/ctc_loss_calculator.cc:144] No valid path found 或 loss:inf的解决方案
- 『快乐链覆盖 树形dp』
- Java学习:Properties类
- react的标记渲染机制
- Java向MySQL新增记录时间误差问题
- 练手WPF(一)——模拟时钟与数字时钟的制作(上)
- asp.net core流式上传大文件
- ORA-03113: 通信通道的文件结束解决方法一例
- 《EOPL》 : 实现了 call/cc