当前位置: 首页 > news >正文

Qt5多线程<12>

1.多线程的简单实现

        <1> 在头文件threaddlg.h声明用于界面显示所需的控件,其代码如下:

#ifndef THREADDLG_H
#define THREADDLG_H#include <QDialog>
#include <QPushButton>
#include "workthread.h"
#define MAXSIZE 5class ThreadDlg : public QDialog
{Q_OBJECTpublic:ThreadDlg(QWidget *parent = 0);~ThreadDlg();    
private:QPushButton *startBtn;QPushButton *stopBtn;QPushButton *quitBtn;
public slots:void slotStart();void slotStop();
private:WorkThread *workThread[MAXSIZE];
};#endif // THREADDLG_H

         <2> 在源文件“threaddlg.cpp的构造函数中,完成各个控件的初始化工作其具体代码如下:

#include "threaddlg.h"
#include <QHBoxLayout>ThreadDlg::ThreadDlg(QWidget *parent): QDialog(parent)
{setWindowTitle(tr("线程"));startBtn = new QPushButton(tr("开始"));stopBtn = new QPushButton(tr("停止"));quitBtn = new QPushButton(tr("退出"));QHBoxLayout *mainLayout = new QHBoxLayout(this);mainLayout->addWidget(startBtn);mainLayout->addWidget(stopBtn);mainLayout->addWidget(quitBtn);connect(startBtn,SIGNAL(clicked()),this,SLOT(slotStart()));connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStop()));connect(quitBtn,SIGNAL(clicked()),this,SLOT(close()));
}ThreadDlg::~ThreadDlg()
{}void ThreadDlg::slotStart()
{for(int i=0;i<MAXSIZE;i++){workThread[i]=new WorkThread();}for(int i=0;i<MAXSIZE;i++){workThread[i]->start();}startBtn->setEnabled(false);stopBtn->setEnabled(true);
}void ThreadDlg::slotStop()
{for(int i=0;i<MAXSIZE;i++){workThread[i]->terminate();workThread[i]->wait();}startBtn->setEnabled(true);stopBtn->setEnabled(false);
}

        <3> 以上完成了界面的设计及调用线程实例,下面的内容是具体的功能实现。

        <3-1>在头文件“workthread.h”中,工作线程WorkThread类继承自QThreao类。重新实现run()函数。其具体代码如下:

#ifndef WORKTHREAD_H
#define WORKTHREAD_H#include <QThread>class WorkThread : public QThread
{Q_OBJECT
public:WorkThread();
protected:void run();
};#endif // WORKTHREAD_H

        <3-2> 在源文件“workthread.cpp”中添加具体实现代码如下:

#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;}
}

<4> main.cpp中代码实现

#include "threaddlg.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);ThreadDlg w;w.show();return a.exec();
}

<5> 运行效果,如下所示:

2.多线程的控制

        多线程控制可通过互斥量和信号量。

2.1 互斥量

       为了防止多个线程对同一个资源进行访问,Qt中加入互斥量,互斥量可以通过QMutex或者QMutexLocker

http://www.lryc.cn/news/224463.html

相关文章:

  • Linux学习笔记之五(父子进程、孤儿进程、僵尸进程、守护进程)
  • [题] 不容易系列之(3)―― LELE的RPG难题 #DP
  • pip 安装任意软件包报错
  • NLP之Bert实现文本多分类
  • 对话大众软件子公司:中国的智舱、智驾比欧洲早一代
  • 基于FPGA的图像RGB转HSV实现,包含testbench和MATLAB辅助验证程序
  • 小型企业如何数字化转型?ZohoCRM助力小企业转型
  • 聊聊模板引擎<Template engine>
  • 多平台商品采集——API接口:支持淘宝、天猫、1688、拼多多等多个电商平台的爆款、销量、整店商品采集和淘客功能
  • UI自动化测试框架设计(Selenium)
  • towr code阅读
  • Channel扇出模式
  • 学者观察 | 联邦学习与区块链、大模型等新技术的融合与挑战-北京航空航天大学童咏昕
  • ubuntu连接蓝牙耳机
  • 长春理工大学漏洞报送证书
  • Excel和Chatgpt是最好的组合。
  • Java用Jsoup库实现的多线程爬虫代码
  • layui控件开发,实现下拉搜索从数据库获取数据
  • 让代码变美的第一天 - 观察者模式
  • 微服务-网关设计
  • WxJava使用lettuce的redis实现access_token的共享
  • 干货:如何运作一个全新品牌?
  • TCP/IP卷一详解第二章Internet地址结构概要
  • 小程序 打开方式 页面效果 表单页面 点击跳到详情页 图标 获取后台数据 进行页面渲染
  • 一个“Hello, World”Flask应用程序
  • 计算机丢失mfc100.dll如何恢复,详细解析mfc100.dll文件丢失解决方法
  • 分享一本让你真正理解深度学习的书
  • Apache APISIX Dashboard 未经认证访问导致 RCE(CVE-2021-45232)漏洞复现
  • Git 安全警告修复手册:解决 `fatal: detected dubious ownership in repository at ` 问题 ️
  • 【MySQL事务篇】多版本并发控制(MVCC)