Qt多线程文件查找器

news2024/11/15 15:47:54

⭐️我叫恒心,一名喜欢书写博客的研究生在读生。

原创不易~转载麻烦注明出处,并告知作者,谢谢!!!

这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。

在这里插入图片描述

Qt多线程文件查找器

前言

最近在实现一些代码功能的时候,需要找一些多线程样例来学习,于是就想试着实现一个多线程的文件查找器,看看有哪些实现方式🤙。

方法一:

通过线程池实现:

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QList>
#include <QRunnable>
#include <QThreadPool>
#include <QDebug>

class SearchTask : public QRunnable {
public:
    explicit SearchTask(const QString& text, const QString& path)
        : m_text(text), m_path(path) {}

    void run() override {
        QDir dir(m_path);
        QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);

        for (const QFileInfo& fileInfo : list) {
            if (fileInfo.isDir()) {
                // 如果是目录,创建新的任务并放入线程池中
                SearchTask* task = new SearchTask(m_text, fileInfo.absoluteFilePath());
                QThreadPool::globalInstance()->start(task);
            } else if (fileInfo.isFile()) {
                // 如果是文件,查找文件内容是否包含搜索文本
                QFile file(fileInfo.absoluteFilePath());
                if (file.open(QIODevice::ReadOnly)) {
                    QTextStream in(&file);
                    QString line;
                    while (!in.atEnd()) {
                        line = in.readLine();
                        if (line.contains(m_text, Qt::CaseInsensitive)) {
                            qDebug() << fileInfo.absoluteFilePath() << ": " << line;
                        }
                    }
                    file.close();
                }
            }
        }
    }

private:
    QString m_text;
    QString m_path;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString searchText = "Qt";
    QString searchPath = "C:/";

    SearchTask* task = new SearchTask(searchText, searchPath);
    QThreadPool::globalInstance()->start(task);

    return a.exec();
}

在这个 demo 中,我们通过 SearchTask 类来表示一个搜索任务。在 SearchTask 类的 run 方法中,我们使用 QDirQFileInfo 类来遍历目录下的所有文件和子目录,如果是子目录则创建新的任务并放入线程池中,如果是文件则查找文件内容是否包含搜索文本。

main 函数中,我们首先创建一个 SearchTask 对象并将其放入线程池中执行。由于线程池是全局的,因此我们不需要手动创建线程,只需要向线程池中添加任务即可。

方法二:

#include <QApplication>
#include <QDirIterator>
#include <QMutex>
#include <QObject>
#include <QString>
#include <QStringList>
#include <QThread>
#include <QVector>

class Searcher : public QObject {
  Q_OBJECT

public:
  Searcher(QString path, QString pattern) : m_path(path), m_pattern(pattern) {}

public slots:
  void search() {
    QStringList files;
    QDirIterator dir_iterator(m_path, QDir::NoFilter, QDirIterator::Subdirectories);
    while (dir_iterator.hasNext()) {
      dir_iterator.next();
      if (dir_iterator.fileInfo().isFile() && dir_iterator.fileName().contains(m_pattern, Qt::CaseInsensitive)) {
        files.append(dir_iterator.filePath());
      }
    }
    emit searchFinished(files);
  }

signals:
  void searchFinished(const QStringList &files);

private:
  QString m_path;
  QString m_pattern;
};

class SearcherThread : public QThread {
  Q_OBJECT

public:
  SearcherThread(QString path, QString pattern) : m_path(path), m_pattern(pattern) {}

  void run() {
    Searcher searcher(m_path, m_pattern);
    connect(&searcher, &Searcher::searchFinished, this, &SearcherThread::searchFinished);
    searcher.search();
  }

signals:
  void searchFinished(const QStringList &files);

private:
  QString m_path;
  QString m_pattern;
};

class FileSearcher : public QObject {
  Q_OBJECT

public:
  FileSearcher(QObject *parent = nullptr) : QObject(parent) {}

  void search(QString path, QString pattern) {
    // Abort any previous search if one is running
    if (m_searcherThread) {
      m_searcherThread->quit();
      m_searcherThread->wait();
      delete m_searcherThread;
      m_searcherThread = nullptr;
    }

    // Start the new search in a new thread
    m_searcherThread = new SearcherThread(path, pattern);
    connect(m_searcherThread, &SearcherThread::searchFinished, this, &FileSearcher::handleSearchFinished);
    m_searcherThread->start();
  }

signals:
  void searchFinished(const QStringList &files);

private:
  SearcherThread *m_searcherThread = nullptr;

private slots:
  void handleSearchFinished(const QStringList &files) {
    // Clean up the thread and emit the search results
    m_searcherThread->deleteLater();
    m_searcherThread = nullptr;
    emit searchFinished(files);
  }
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  FileSearcher fileSearcher;

  QObject::connect(&fileSearcher, &FileSearcher::searchFinished, [&](const QStringList &files) {
    // Handle search results
    for (const QString &file : files) {
      qDebug() << file;
    }
  });

  fileSearcher.search("/", "");

  return app.exec();
}

#include "main.moc"

其中包括了三个类:SearcherSearcherThreadFileSearcher

Searcher 类用于在给定的路径下查找文件名包含特定模式的文件。Searcher 类中的 search() 方法是在一个单独的线程中执行的,会遍历给定路径下的所有文件并查找符合条件的文件,将结果存储在字符串列表 files 中,最后通过 searchFinished 信号将结果发送回主线程。

SearcherThread 类是 Searcher 类的一个包装,用于在一个新的线程中执行 Searcher::search() 方法。通过将 Searcher 对象与 SearcherThread 对象进行连接,可以在 SearcherThread 对象中触发 Searcher::search() 方法并获取结果。

FileSearcher 类是一个简单的类,负责协调 SearcherThread 类的使用。当搜索操作开始时,FileSearcher 类会首先检查是否有任何旧搜索操作正在进行。如果有,它会终止旧操作并等待它完成。然后,它会在新线程中启动一个新的 SearcherThread 对象,并在其上连接一个槽,以接收 SearcherThread 对象的 searchFinished 信号。当搜索操作完成后,FileSearcher 类会清理线程并发出 searchFinished 信号。

main() 函数中,FileSearcher 对象 fileSearcher 被创建,并与其 searchFinished 信号连接一个 Lambda 表达式,以处理搜索结果。然后,search() 方法被调用,以启动搜索操作。最后,应用程序进入主事件循环,等待搜索结果。

最后一行 #include "main.moc" 是用于将 Qt 元对象代码(MOC)合并到可执行文件中,以便在运行时使用信号和槽。

最后 🐶狗头保命

一名喜欢书写博客的研究生在读生

如果觉得有用,麻烦三连支持一下欧,希望这篇文章可以帮到你,你的点赞是我持续更新的动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC并发编程——wait-notify

目录一、wait / notify1.1 wait / notify 原理1.2 wait / notify API介绍二、wait VS sleep三、wait / notify —代码改进一、wait / notify 1.1 wait / notify 原理 ● Owner线程发现条件不满足&#xff0c;调用wait( )方法即可进入WaitSet变为 WAITING状态 ● BLOCKED 和 W…

AI的简单介绍

什么是AI&#xff1f; AI 是 Artificial Intelligent 的缩写&#xff0c;是我们通常意义上说的人工智能。 简单来说就是让机器能够模拟人类的思维能力&#xff0c;让它能够像人一样感知、思考甚至决策。 为什么要开发AI&#xff1f; 因为在过去&#xff0c;都是我们学习机器…

408 计算机基础复试笔记 —— 更新中

计算机组成原理 计算机系统概述 问题一、冯诺依曼机基本思想 存储程序&#xff1a;程序和数据都存储在同一个内存中&#xff0c;计算机可以根据指令集执行存储在内存中的程序。这使得程序具有高度灵活性和可重用性。指令流水线&#xff1a;将指令分成若干阶段&#xff0c;每…

opencv学习(一)图像的基本操作

数据的读取cv2.IMREAD_COLOR:彩色图像cv2.IMREAD_GRAYSCALE:灰度图像import cv2 img cv2.imread(E:/opencv/open-cv/2-7/cat.jpg,1)cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imread()读取图片&#xff0c;当括号里面是1时&#xff…

华为OD机试题,用 Java 解【水仙花数】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

抓包技术(浏览器APP小程序PC应用)

P1 抓包工具 01. Fidder 首先第一个Fiddler它的优势&#xff0c;独立运行&#xff0c;第二个支持移动设备&#xff08;是否能抓移动APP的包&#xff0c;&#xff09;在这一块的话wireshark、httpwatch就不支持&#xff0c;因此在这一块就可以排除掉前连个&#xff0c;因为我们…

SpringCloudGateway--基于redis实现令牌桶算法

目录 一、限流算法 1、计数器算法 2、漏桶算法 3、令牌桶算法 二、Gateway中的限流 一、限流算法 1、计数器算法 计数器算法是指从第一个请求开始&#xff0c;每多一个请求就加1&#xff0c;假设设置每秒限流100&#xff0c;当在一秒钟前500ms已经达到100&#xff0c;后面的5…

华为云计算HCIA学习笔记-第1章 云计算基础概念

1.1 云计算课程安排说明 &#xff08;IA-虚拟化-FC / IP-Linux OpenStack 桌面云/IE-备份容灾迁移&#xff09; 1.2 为什么云计算IA讲虚拟化&#xff1f; 提前告知学员&#xff0c;为什么IA课程要重点讲解虚拟化&#xff1f;云计算基于OpenStack&#xff0c;其底层虚拟化技术…

赞!中原银行|古风金融产品体验运营数字驾驶舱大屏!

本期「V友故事」&#xff1a;中原银行设计师作品——古风金融产品体验运营大屏 金融行业数字化转型是近年来提出的一个关键词&#xff0c;它不仅在改变金融服务的结构、形式和方式&#xff0c;而且也在影响中国金融行业的扩张规模&#xff0c;基于此行业趋势&#xff0c;金融从…

加密图像的脆弱水印及应用

原文题目&#xff1a;《A self-embedding secure fragile watermarking scheme with high quality recovery》 学习笔记&#xff1a; 应用场景 为了确保图像在传输过程中不被损坏&#xff0c;在将原始图像发送到云端之前&#xff0c;将用于篡改检测和恢复的水印嵌入到原始图像…

docker逃逸复现--pid=host模式下的逃逸

漏洞原理当docker以--pidhost模式启动时&#xff0c;你可以通过在容器进程中注入一些shellcode进行逃逸。相当于给了docker Linux中的CAP_SYS_PTRACE权限--pidhost&#xff1a;意味着宿主机与容器公享一套pid&#xff0c;如此做容器就可以访问并跟踪宿主机的进程Linux中的CAP_S…

【微信小程序】-- 页面导航 -- 导航传参(二十四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

MyBatis框架快速入门 - 基本使用

文章目录MyBatisMyBatis基本介绍MyBaits快速入门Mapper代理开发MyBatis配置文件MyBatis MyBatis基本介绍 什么是MyBatis? MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software found…

FPGA实现模拟视频BT656解码 TW2867四路PAL采集拼接显示 提供工程源码和技术支持

目录1、前言2、模拟视频概述3、模拟视频颜色空间4、逐行与隔行5、BT656数据与解码BT656数据格式BT656数据解码6、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析7、设计思路与框架8、vivado工程详解9、上板调试验证10、福利&#xff1a;工程代码的获取1、前言…

【Spring6】| GoF之工厂模式

目录 一&#xff1a;GoF之工厂模式 1. 工厂模式的三种形态 2. 简单工厂模式 3. 工厂方法模式 4. 抽象工厂模式&#xff08;了解&#xff09; 一&#xff1a;GoF之工厂模式 &#xff08;1&#xff09;GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组…

前端开发总结的一些技巧和实用方法(2)

本文主要介绍一些JS中用到的小技巧和实用方法&#xff0c;可以在日常Coding中提升幸福度&#xff0c;也可以通过一些小细节来增加代码可读性&#xff0c;让代码看起来更加优雅&#xff0c;后续将不断更新1.数组 map 的方法 (不使用Array.Map) Array.from 还可以接受第二个参数…

一文讲解JDK自带监控工具查看 JVM 情况

在一文带你了解阿里的开源Java诊断工具 &#xff1a;Arthas_出世&入世的博客-CSDN博客这篇文章中介绍了Arthas的强大功能&#xff0c;但是有些生成环境没有安装&#xff0c;所以还是需要会使用JDK 自带监控JVM的工具。 常用的JDK 自带监控工具如下&#xff1a; jps&#x…

CDH大数据平台入门篇之搭建与部署

一、CDH介绍 1.CDH 是一个强大的商业版数据中心管理工具 提供了各种能够快速稳定运行的数据计算框架&#xff0c;如Spark&#xff1b; 使用Apache Impala做为对HDFS、HBase的高性能SQL查询引擎&#xff1b; 使用Hive数据仓库工具帮助用户分析数据&#xff1b; 提供CM安装HBas…

真正的IT技术男是什么样的?

我们经常会听到很多对IT男士的调侃称呼&#xff0c;“屌丝”、“宅男”&#xff0c;会逗的大家捧腹大笑。但是&#xff0c;大家要不要以为称呼IT男是“屌丝”、“宅男”&#xff0c;就当真以为他们是这样了。今天&#xff0c;青鸟学姐就带大家一起来了解一下&#xff0c;真正的…

代码还原小试牛刀(一):魔改的MD5

一、目标 2023年了&#xff0c;MD5已经是最基础的签名算法了&#xff0c;但如果你还只是对输入做了简单的MD5&#xff0c;肯定会被同行们嘲笑。加点盐&#xff08;salt&#xff09;是一种基本的提升&#xff0c;但在这个就业形势严峻的时代&#xff0c;仅仅加盐肯定不够了。 …