Qt多线程文件查找器
创始人
2024-05-29 07:37:44
0

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

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

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

在这里插入图片描述

Qt多线程文件查找器

前言

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

方法一:

通过线程池实现:

#include 
#include 
#include 
#include 
#include 
#include 
#include 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 
#include 
#include 
#include 
#include 
#include 
#include 
#include class Searcher : public QObject {Q_OBJECTpublic: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_OBJECTpublic: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_OBJECTpublic:FileSearcher(QObject *parent = nullptr) : QObject(parent) {}void search(QString path, QString pattern) {// Abort any previous search if one is runningif (m_searcherThread) {m_searcherThread->quit();m_searcherThread->wait();delete m_searcherThread;m_searcherThread = nullptr;}// Start the new search in a new threadm_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 resultsm_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 resultsfor (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)合并到可执行文件中,以便在运行时使用信号和槽。

最后 🐶狗头保命

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

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

相关内容

热门资讯

通达信向右画直线段公式怎么写 通达信向右画直线段公式怎么写一种是满足条件,从条件起只画一段,到今天的。DRAWLINE(条件,位置...
连接小爱音箱的步骤 连接小爱音箱的步骤1.将小爱音箱接通电源。2.然后长按ch键进入配置模式。3.打开小爱音箱后,点击添...
西游记微讲 西游记微讲一群笨笨的妖与一群笨笨的人。
激情的电子书 激情的电子书好看的电子书像《魔师再现》一样那种段子稍微多点的... 好看的电子书 像《魔师再现》一...
上帝保佑。 上帝保佑。 “上帝保佑”只是一种精神寄托,命运掌握在自己手里。如果心态好、凡事尽力而为,那么运气不会...
七年级上册英语第九单元50页2... 七年级上册英语第九单元50页2d的翻译翻译的太 棒了! ...
山东高速发布2024年报,拟每...   4月3日晚,山东高速股份有限公司(以下简称“山东高速”或“公司”)披露了2024年度报告。报告期...
商品日报(4月3日):假期前商... 转自:新华财经新华财经北京4月3日电(吴郑思、郭洲洋)宏观面消息影响,叠加清明假期前市场资金主动离场...
漳浦县实验小学举办“我们的节日...   漳州新闻网讯(李锦华 陈凯丽)4月3日下午,漳浦县实验小学三号楼三楼多媒体教室热闹非凡,一场由漳...
连续四年蝉联第一,「东鹏饮料」...   来源:活报告 来源:招股书  摘要:东鹏饮料于2025年4月3日向港交所递交招股书,拟在香港主板...
天气原因致马航370航班客机搜... 转自:新华网新华社吉隆坡4月3日电(记者王嘉伟 毛鹏飞)据马来西亚媒体3日报道,马交通部长陆兆福表示...
新疆新型储能装机突破1000万... 中新网乌鲁木齐4月3日电 (余艳春 丁碧薇)4月2日,随着华电凯升木垒雀仁光伏储能一站并网投运,新疆...
从央视辞职出去镀金的李佳明,现... 从央视辞职出去镀金的李佳明,现状怎样?还可以吧。但是这个选择不一定是很对的。但是既然都已经这样了,其...
怎样做一个简单又漂亮的一封信 怎样做一个简单又漂亮的一封信用卡纸折一些简单的小东西,是幼儿园手工课里常有的内容。一张普通的纸折一折...
兴发集团:2025年公司草甘膦... 证券之星消息,兴发集团(600141)04月03日在投资者关系平台上答复投资者关心的问题。投资者:长...
南昌红谷滩区:宣传小分队集合 ... 青春正逢盛世,奋斗恰如其时。近日,一场精彩纷呈的检察宣传文化交流读书分享会在南昌市红谷滩区人民检察院...
至纯科技:公司客户包括三星、海... 投资者提问:董秘你好,公司与三星、海力士等半导体国际巨头,是否存在合作关系?董秘回答(至纯科技SH6...
3月逆袭黑马!深海科技才刚启动... (来源:永赢基金)3月A股从普涨进入震荡,科技风格集体回调。在市场遇冷的同时,有一个板块却走出逆袭表...
招商港口:2025年度拟在招商... 招商港口公告,2025年度拟在 招商银行 进行最高存款余额不超过人民币100亿元、最高信贷余额不超过...
敦煌智能育苗助春耕 奏响现代农... 中新网甘肃新闻4月3日电 (张晓蛟 刘婕)随着天气逐渐回暖,春耕备耕进入关键时期。敦煌市莫高镇瓜菜种...