QT学习笔记:多线程操作

2023-11-15

做了一个demo展示两种形式的多线程操作,第二种常用

  1. new QThread Class & Override run()
  2. new Object Class & moveToThread(new QThread)
// threadfirst.h  第一种形式的线程操作
#ifndef THREADFIRST_H
#define THREADFIRST_H

#include <QThread>
#include <QObject>

class ThreadFirst :  public QThread
{
    Q_OBJECT
public:
    explicit ThreadFirst(QObject *parent = nullptr);
    ~ThreadFirst();
protected:
    void run();
signals:
    void finish(const QString &str);
};

#endif // THREADFIRST_H

// threadfirst.cpp
#include "threadfirst.h"
#include <QDebug>
ThreadFirst::ThreadFirst(QObject *parent) :  QThread(parent)
{
}

ThreadFirst::~ThreadFirst()
{
}

void ThreadFirst::run()
{
    sleep(2);
    QString str = "threadFirst is finished";
    emit finish(str);
}

// threadsec.h  第二种形式的线程操作
#ifndef THREADSEC_H
#define THREADSEC_H
#include <QObject>
#include <QTimer>
class ThreadSec : public QObject
{
    Q_OBJECT
public:
    explicit ThreadSec();
    ~ThreadSec();
    void stopTimer();
signals:
    void finish();
private slots:
    void handleThread();
private:
    QTimer sigTimer; // 延时发出信号
};
#endif // THREADSEC_H
// threadsec.cpp
#include "threadsec.h"
ThreadSec::ThreadSec()
{
    connect(&sigTimer, &QTimer::timeout, this, &ThreadSec::handleThread);
    sigTimer.start(3000);
}
ThreadSec::~ThreadSec()
{

}
void ThreadSec::handleThread()
{
    emit finish();
}
void ThreadSec::stopTimer()
{
    sigTimer.stop();
}

主窗口类

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "threadfirst.h"
#include "threadsec.h"
#include <QThread>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

    void on_btnFirst_clicked();

    void on_btnSec_clicked();

private:
    Ui::MainWindow *ui;
    ThreadFirst *_threadFirst = nullptr;
    ThreadSec *_threadSec = nullptr;
    QThread *_thread = nullptr;
};
#endif // MAINWINDOW_H

///
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow::~MainWindow()
{
    _threadFirst->quit();
    _threadFirst->wait();

    _thread->quit();
    _thread->wait();

    delete ui;
}
void MainWindow::on_btnFirst_clicked()
{
    _threadFirst = new ThreadFirst();
    connect(_threadFirst, &ThreadFirst::finished, _threadFirst, &QObject::deleteLater);
    connect(_threadFirst, &ThreadFirst::finish, this, [=] (QString str) {
        ui->lcdNumber->display(99);
        qDebug() << str;
    });
    _threadFirst->start();
}
void MainWindow::on_btnSec_clicked()
{
    int i = 0;
    _threadSec = new ThreadSec();
    _thread = new QThread();
    _threadSec->setObjectName("second use");
    _threadSec->moveToThread(_thread);
    connect(_thread, &QThread::finished, _threadSec, &QObject::deleteLater);
    connect(_threadSec, &ThreadSec::finish, this, [=] () mutable {
        ui->lcdNumber->display(i++);
        if (i >= 10) _threadSec->stopTimer();
        qDebug() << "threadSec is finished";
    });
    _thread->start();
}

  • 问题:关于多线程同时访问同一个函数
    每个线程都有自己的栈区存放局部变量,不同线程调用函数的局部变量,保存在不同线程的栈区中,这种情况不需要进行互斥处理。
    需要进行互斥处理的情况通常是,函数中有全局变量,有动态申请的空间,静态变量,成员变量,或者是线程需要进行循环发送读取操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT学习笔记:多线程操作 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • Google App Engine对Java支持情况一览

    Google App Engine对Java支持情况一览 http developer 51cto com 2009 04 09 11 06 杨赛 译 51CTO com 我要评论 0 Google App Engine的Java支持已发布
  • 华为OD机试-快递运输

    Online C compiler to run C program online include
  • Java程序的三种流程结构

    1 顺序结构 按照顺序一句一句执行 Java的基本结构就是顺序结构 2 循环结构 在顺序结构的基础下 重复执行相同或者相似的代码 for while do while 3分支结构 有条件的去执行某个语句 条件满足就执行下面的语句 条件不满足
  • SQL注入攻击流程

    1 判断SQL注入点 本质原理是 找一个需要后台处理后提交给数据库的点 所有的输入只要和数据库进行交互的 都有可能触发SQL注入 一般为三大类 Get参数触发SQL注入 POST参数触发SQL注入 Cookie触发SQL注入 而验证是否存在
  • 华为手机打开图片很慢是怎么回事_华为手机相册打开很慢怎么解决?

    造成卡顿的原因 相册里存储信息较多 由于手机读取相册中的信息需要一定时间 可能出现卡顿现象 系统卡顿通用解决办法 请保持手机电量高于 20 手机低电量时为了延长待机时间 保护手机 会对手机的性能进行限制 卸载第三方手机管家类软件 如果您的手
  • 【Python】首届一年一度秀代码时间罒ω罒

    声明 以下代码大家如果有兴趣的话可以用LDLE代码编辑器运行看看 NO 1 万能计算器 难度系数 1 算术运算符 a input 请输入第一个数字 b input 请输入第二个数字 a float a b float b print 和 a
  • 小韭菜

    大家好 我是章鱼猫 今天给大家推荐的这个项目是 leeks 原名小韭菜 后改名为 leeks 这是一个 IDEA 查看股票 基金插件 写代码的同时还能瞄一眼股票 基金 真的是工作 搞基两不误 安装 下载当前最新的安装包 leeks 1 3
  • 解决 linux在 VMware中的问题 汇总 (***)

    目录 解决Ubuntu在VMware中不能全屏的问题 无需安装 VMware tools 解决虚拟机与宿主机的文件共享问题 Ubuntu Window下 X2Go 安装 连接 同步 上传文件夹 复制 粘贴 桌面共享 Linux挂载共享文件夹
  • 命令行中Gradle创建项目的打包和运行,新手起步

    第一步 下载 下载 https gradle org 官网 gt install gt releases page gt binary only 下载 下载页 https gradle org releases close notifica
  • vue中在字符串中添加点击事件

    如果你在用vue写项目中遇到了需要在字符串中写点击事件的奇葩写法 你会不会感到很头疼 我不知道你会不会 反正我肯定会 没办法谁叫咋遇到了呢 话不多说 直接上代码 html div class ml 12 mr 12 mt 8 div 采用的
  • 华为OD机试 - 可以组成网络的服务器(Java)

    题目描述 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有 如果两台服务器位于同一行或者同一列中紧邻的位置 则认为它们之间可以组成一个局域网 请你统计机房中最大的局域网包含的服务器个数 输入
  • Docker-compose安装及使用教程

    docker compose安装 方法一 首先执行pip V确认是否已安装pip 若提示 未找到命令 则根据以下步骤执行 若显示pip版本则直接执行步骤2安装即可 1 安装pip wget https bootstrap pypa io g
  • SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)

    项目开发中经常需要执行一些定时任务 比如需要在每天凌晨时候 分析一次前一天的日志信息 Spring为我们提供了异步执行任务调度的方式 提供TaskExecutor TaskScheduler 接口 SpringBoot中使用两个注解 Ena
  • C++中关于隐藏的理解

    引言 在使用中弄清楚隐藏的区别之后 还需要明白怎么使用 下面说以下隐藏 重写 重载的区别 与重载的区别 在父类与子类中 函数名相同 参数不同 无论父类中的同名函数是否含有virtual关键字 都是隐藏 与重写的区别 在父类和子类中 函数名相
  • MySQL引起索引失效的原因

    原创92 4 发布于2018 11 30 19 35 07 阅读数 451 收藏 展开 查看索引结构 mysql gt show index from staffs Table Non unique Key name Seq in inde
  • cmake_policy规定了cmake解析行为

    https blog csdn net gispipi article details 108275569
  • Python中字符串和列表去重方法

    本文主要为大家整理了Python中实现字符串和列表去重的常用方法 文中的示例代码讲解详细 对我们深入了解Python有一定的帮助 感兴趣的可以了解一下 字符串去重 1 直接遍历字符串的方式 1 2 3 4 5 6 7 8 coding UT
  • Redis第三讲 Redis 4.0 混合持久化与Redis数据备份策略

    RDB 和 AOF 持久化各有利弊 RDB 可能会导致一定时间内的数据丢失 而 AOF 由于文件较大则会影响 Redis 的启动速度 为了能同时使用 RDB 和 AOF 各种的优点 Redis 4 0 之后新增了混合持久化的方式 加载优先级
  • 【理论实践】指向类模板函数的指针的使用(以std::list为例)

    假设有这个一个场景 我们希望根据条件决定插入元素到list首或尾 条件判断一次 插入操作多次 例如二叉树 至少要处理左和右各一次 普通的代码很简单 每次操作时 都判断一下 简化一下是一个三元表达式 巧妙一点的 可以定义一个变量指定接口函数
  • QT学习笔记:多线程操作

    做了一个demo展示两种形式的多线程操作 第二种常用 new QThread Class Override run new Object Class moveToThread new QThread threadfirst h 第一种形式的