Qt多线程的创建及使用方法_qt5多线程 创建 一定要放在主线程中2吗-程序员宅基地

技术标签: QT  

参考:http://blog.csdn.net/rl529014/article/details/52815341

在上一篇文章中,转载了Qt创建多线程的两种方法,分别是继承QThread和继承QObject,文章较长,看得有点晕,但理论性比较全面,所以记录下来

本文通过最简单、最常用的方法,来实现多线程的创建,至于提到的其它问题,再慢慢优化吧

多线程的特点:

1、  多个线程共享进程的内存空间,多线程内存空间统一。

2、  每个线程都有自己独立的栈空间,多个线程之间是相互独立的。

3、  线程是操作系统运算调度的最小单位。

4、  进程支持多线程,但是必须有一个主线程。

5、  子线程都是通直接或者间接的通过主线程启动。

6、  主线程结束,所有子线程也会结束。

常用函数:

MoveToThread();

CurrentThread(),返回当前线程的指针。

CurrentThreadId(),返回当前线程的句柄。

生存线程:线程被创建时,该线程所在的线程。 

注意:

多线程不是必须的,大多数情况下,一个主线程就可以完成相应的工作。

线程越多,对系统造成的负担越大。

实现多线程的方法:

1、Qthread(传统方法):继承自Qthread,实现run()函数,执行Qthread的start函数,线程开始执行。

2、Qtconcurrt(高级API,更加方便使用)

例:

下面以继承QThread,重写run()函数为例

功能:在主线程中创建两个子线程,点击start和stop分别开始和结束打印文本。

ui文件主界面:


先看效果图:


源码:

//main.cpp


    
    
     
  1. #include <QApplication>
  2. #include <QDebug>
  3. #include "threaddialog.h"
  4. #include <QThread>
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. ThreadDialog dialog ;
  9. dialog.show();
  10. return a.exec();
  11. }

//thread.h


    
    
     
  1. #ifndef THREAD_H
  2. #define THREAD_H
  3. #include <QThread>
  4. #include <QtCore>
  5. #include <QObject>
  6. #include <QMutex>
  7. #include <iostream>
  8. using namespace std;
  9. class Thread : public QThread
  10. {
  11. Q_OBJECT
  12. public:
  13. Thread();
  14. void setMessage(const QString &message);
  15. void stop();
  16. private slots:
  17. void run();
  18. private:
  19. QString messageStr;
  20. volatile bool stopped;
  21. };
  22. #endif // THREAD_H

//thread.cpp


    
    
     
  1. #include "thread.h"
  2. #include <QTimer>
  3. #include <QMutexLocker>
  4. Thread::Thread()
  5. {
  6. stopped = false;
  7. }
  8. void Thread::setMessage( const QString &message)
  9. {
  10. messageStr = message;
  11. }
  12. void Thread::stop()
  13. {
  14. stopped = true;
  15. }
  16. void Thread::run()
  17. {
  18. while(!stopped)
  19. {
  20. qDebug()<<messageStr;
  21. }
  22. stopped = false;
  23. std:: cerr<< std:: endl;
  24. }

//threaddialog.h


    
    
     
  1. #ifndef THREADDIALOG_H
  2. #define THREADDIALOG_H
  3. #include <QMainWindow>
  4. #include "thread.h"
  5. #include <QPushButton>
  6. #include <QCloseEvent>
  7. namespace Ui {
  8. class ThreadDialog;
  9. }
  10. class ThreadDialog : public QMainWindow
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit ThreadDialog(QWidget *parent = 0);
  15. ~ThreadDialog();
  16. protected:
  17. void closeEvent(QCloseEvent *e);
  18. private:
  19. Thread threadA;
  20. Thread threadB;
  21. QPushButton *threadABtn;
  22. QPushButton *threadBBtn;
  23. QPushButton *quitBtn;
  24. private slots:
  25. void startOrStopThreadA();
  26. void startOrStopThreadB();
  27. void on_quit_clicked();
  28. private:
  29. Ui::ThreadDialog *ui;
  30. };
  31. #endif // THREADDIALOG_H

//threaddialog.cpp


    
    
     
  1. #include "threaddialog.h"
  2. #include "ui_threaddialog.h"
  3. #include <QTimer>
  4. ThreadDialog::ThreadDialog(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui( new Ui::ThreadDialog)
  7. {
  8. ui->setupUi( this);
  9. threadA.setMessage( "I am A");
  10. threadB.setMessage( "I am B");
  11. threadABtn = new QPushButton( "Start A");
  12. threadBBtn = new QPushButton( "Start B");
  13. quitBtn = new QPushButton( "Quit");
  14. connect(ui->threadABtn,SIGNAL(clicked( bool)),SLOT(startOrStopThreadA()));
  15. connect(ui->threadBBtn,SIGNAL(clicked( bool)),SLOT(startOrStopThreadB()));
  16. }
  17. ThreadDialog::~ThreadDialog()
  18. {
  19. delete ui;
  20. }
  21. void ThreadDialog::closeEvent(QCloseEvent *e)
  22. {
  23. threadA.stop();
  24. threadB.stop();
  25. threadA.wait();
  26. threadB.wait();
  27. e->accept();
  28. }
  29. void ThreadDialog::startOrStopThreadA()
  30. {
  31. if(threadA.isRunning())
  32. {
  33. threadA.stop();
  34. ui->threadABtn->setText( "Start A");
  35. }
  36. else
  37. {
  38. threadA.start();
  39. ui->threadABtn->setText( "Stop A");
  40. }
  41. }
  42. void ThreadDialog::startOrStopThreadB()
  43. {
  44. if(threadB.isRunning())
  45. {
  46. threadB.stop();
  47. ui->threadBBtn->setText( "Start B");
  48. }
  49. else
  50. {
  51. threadB.start();
  52. ui->threadBBtn->setText( "Stop B");
  53. }
  54. }
  55. void ThreadDialog::on_quit_clicked()
  56. {
  57. close();
  58. }

源码下载:http://download.csdn.net/detail/rl529014/9657653


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wu694128/article/details/93354362

智能推荐

fluent里常见基础问题(转)_fluent不同算法对结果影响-程序员宅基地

文章浏览阅读8.4k次,点赞9次,收藏104次。1 什么叫松弛因子?松弛因子对计算结果有什么样的影响?它对计算的收敛情况又有什么样的影响?  1、亚松驰(Under Relaxation):所谓亚松驰就是将本层次计算结果与上一层次结果的差值作适当缩减,以避免由于差值过大而引起非线性迭代过程的发散。用通用变量来写出时,为松驰因子(Relaxation Factors)。《数值传热学-214》  2、FLUENT中的亚松驰:由于FLUENT所解..._fluent不同算法对结果影响

Application Loader上传中断,提示Cannot proceed with delivery: an existing transporter instance is currently_error: cannot proceed with delivery: an existing t-程序员宅基地

文章浏览阅读1k次。把Application Loader(XCode->Organizer->Archived Applications->Submit)中正在上传的文件中断或者删除,再次Submit提示:Cannot proceed with delivery: an existing transporter instance is currently uploading this package。无论如_error: cannot proceed with delivery: an existing transporter instance is cur

typescript的基本结构_Vue3.0 前的 TypeScript 最佳入门实践-程序员宅基地

文章浏览阅读111次。Vue3.0 前的 TypeScript 最佳入门实践前言其实Vue官方从2.6.X版本开始就部分使用Ts重写了。我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了。然鹅最近的一个项目中,是TypeScript+ Vue,毛计喇,学之...…真香!注意此篇标题的“前”,本文旨在讲Ts混入框架的使用,不讲Class API1. 使用官方脚手架构建npm install -g @vu..._vue3.0 typescript目录结构

Science Advances: 中科院微生物所叶健团队揭示双生病毒调控植物免疫平衡制约机制...-程序员宅基地

文章浏览阅读601次。病毒,作为非细胞的生物形式,只能在活细胞内增殖,专性活细胞内寄生。我们居住的星球病毒数量惊人,大约有1031个,其基因头尾相连可长达2.5亿光年。现代微生物学的奠基人路易斯巴斯德用病毒(..._editor daniel j kliebenstein

Java导出Word文档(可设置字体)_java list数据生成word自定义字体大小和字体颜色-程序员宅基地

文章浏览阅读7.5k次。原作者:兰博基尼http://hujinfan.iteye.com/blog/847029导出内容导Word文档中,可设置字体,亲测可用。importjava.io.FileOutputStream;import java.io.IOException;import java.util.List;importcom.lowagie.text.Document;impo_java list数据生成word自定义字体大小和字体颜色

X1 grok-1 开源大语言模型下载_grok-1下载-程序员宅基地

文章浏览阅读795次,点赞11次,收藏4次。我们正在发布我们的大型语言模型 Grok-1 的基本模型权重和网络架构。Grok-1 是一个 3140 亿参数的专家混合模型,由 xAI 从头开始训练。_grok-1下载

随便推点

Notepad++配置C语言编译环境-程序员宅基地

文章浏览阅读4k次,点赞5次,收藏12次。今天和大家分享一个使用Notepad++配置C语言编译环境的方法,因为本人是一个C语言新手,一般写个小程序用文本编辑器就够用。前提: 下载mingw 或者 Cygwin 或 tdm-gcc 里面有C语言编译器,然后配置环境变量。 https://sourceforge.net/projects/mingw-w64/files/?source=navbar首先: ...

excel文件可以直接转换成图片格式吗?excel文件怎样才能快速转换成图片?excel文件快速转换成图片的方法_excel图片地址转图片-程序员宅基地

文章浏览阅读836次,点赞24次,收藏17次。本文介绍了将Excel文件转换成图片格式的五种方法,包括使用汇帮PDF转换器、Excel内置功能、屏幕截图工具、复制粘贴和另存为图片。转换前需备份文件,选择合适的图片格式和分辨率,注意第三方软件的安全性。转换后便于在不同设备和平台上查看和分享Excel数据_excel图片地址转图片

Linux使用cups进行打印_cups/cups.h-程序员宅基地

文章浏览阅读2.2k次。复制的代码,还没有试过。#include <cups/cups.h>//...int print_label( const char *text, const char *printer_name, const char *job_name ){ int jobId = 0;jobId = cupsCreateJob( CUPS_HTTP_DEFAULT,..._cups/cups.h

在腾讯云上创建您的SQL Cluster(1)_腾讯云 搭建sql集群-程序员宅基地

文章浏览阅读431次。在国内公有云厂商上搭建一套SQL Cluster的难度相信做Windows的童鞋都会很清楚,并非它的搭建有多少难度,只是很多细节需要注意。腾讯云,QCloud,为什么选择QCloud来做这个实验,除了QCloud是我的东家(这里我没收任何广告费啊),其实QCloud对Windows原生态保留得最好,所以很多种Windows实验(解决方案)在QCloud都是支持的。所以,今天我就来讲_腾讯云 搭建sql集群

[论文]CVPR2019论文GIoU解读_giou论文-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏15次。本文是对 CVPR2019 论文《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》的解读: 论文地址:https://arxiv.org/abs/1902.096301.Motivation 包围框回归是2D/3D 视觉任务中一个最基础的模块,不管..._giou论文

相对熵/KL散度(Kullback–Leibler divergence,KLD)-程序员宅基地

文章浏览阅读819次。相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain)。 KL散度是两个概率分布P和Q差别的非对称性的度量。 KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的比特个数。 典型情况..._kull-back entropy

推荐文章

热门文章

相关标签