每个程序启动后拥有的第一个线程称为主线程,即gui线程。qt中所有的组件类和几个相关的类只能工作在gui线程,不能工作在次线程,次线程即工作线程,主要负责处理gui线程卸下的工作。
每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。
qt通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。
qt中线程类包含如下:
qthread提供了跨平台的多线程解决方案qthreadstorage提供逐线程数据存储qmutex提供相互排斥的锁,或互斥量qmutexlocker是一个辅助类,自动对qmutex加锁与解锁qreadwriterlock提供了一个可以同时读操作的锁qreadlocker与qwritelocker自动对qreadwritelock加锁与解锁qmaphore提供了一个整型信号量,是互斥量的泛化qwaitcondition提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。1、qthread线程基础
qthread是qt线程中有一个公共的抽象类,所有的线程类都是从qthread抽象类中派生的,需要实现qthread中的虚函数run(),通过start()函数来调用run函数。
void run()函数是线程体函数,用于定义线程的功能。
void start()函数是启动函数,用于将线程入口地址设置为run函数。
void terminate()函数用于强制结束线程,不保证数据完整性和资源释放。
qcoreapplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个qthread中调用。在gui程序中,主线程也称为gui线程,是唯一允许执行gui相关操作的线程。另外,必须在创建一个qthread前创建qapplication(or qcoreapplication)对象。
当线程启动和结束时,qthread会发送信号started()和finished(),可以使用isfinished()和isrunning()来查询线程的状态。
从qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finish泯然众人矣ed()信号到qobject::deletelater()槽。
使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。
静态函数currentthreadid()和currentthread()返回标识当前正在执行鸡胸肉怎么做的线程。前者返回线程的id,后者返回一个线程指针。
要设置线程的名称,可以在启动线程之前调用tobjectname()。如果不调用tobjectname(),线程的名称将是线程对象的运行时类型(qthread子类的类名)。
1、建立工程
2、设计ui及控件、控件属性
3、添加工作线程
建立头文件workthread.h
在右侧添加如下代码
#include <qthread> class workthread : public qthread{ q_object public: workthread(); protected: void run();};
4、添加workthread.cpp文件
在右侧添加如下代码:
重写run()函数
重写run()函数
#include "workthread.h"#include <qtdebug> workthread::workthread(){ } void workthread::run(){ while (true) { for ( int n = 0; n < 10; n++ ) { qdebug()<<n<<n<<n<<n<<n<<n<<n<<n; } }}
5、在threaddlg.h中添加如下内容:
#include "workthread.h"#define maxsize 1 public slots: void slotstart(); void slotstop(); void slotexit(); private: workthread *workthread[maxsize];
6、在threaddlg.cpp中完成槽函数功能
心中的美景作文 connect(ui->startbtn, signal(clicked(bool)),this, slot(slotstart())); connect(ui->stopbtn, signal(clicked(bool)),this, slot(slotstop())); connect(ui->exitbtn, signal(clicked(bool)),this, slot(slotexit()));
void threaddlg::slotstart(){ for ( int i = 0; 搞笑微博i < maxsize; i++ ) { workthread[i] = new workthread(); } for ( int i = 0; i < maxsize; i++ ) { workthread[i]->start(); } ui->sta小宇吉他谱rtbtn->tenabled(fal); ui->stopbtn->tenabled(true);}
void threaddlg::slotstop(){ for ( int i = 0; i < maxsize; i++ ) { workthread[i]->terminate(); workthread[i]->wait(); } ui->startbtn->tenabled(true); ui->stopbtn->tenabled(fal);}
void threaddlg::slotexit(){ this->clo();}
运行效果
到此这篇关于qt5多线程编程的实现的文章就介绍到这了,更多相关qt5多线程 内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 03:04:30,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/bf4be2322c875c3db1de56f5d42cac4a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Qt5多线程编程的实现.doc
本文 PDF 下载地址:Qt5多线程编程的实现.pdf
留言与评论(共有 0 条评论) |