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)合并到可执行文件中,以便在运行时使用信号和槽。

最后 🐶狗头保命

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

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

相关内容

热门资讯

23.99万起,搭载华为乾崑,... 2025年4月23日,深蓝汽车旗下全新中大型豪华SUV——深蓝S09预售发布会在上海车展期间正式启幕...
小屏党再也不必妥协!一加13T... 一、前言:单手的神!击穿性能、续航痛点这些年用户苦大屏机已久,厂商们不断堆料虽然配置诚意十足,但逐渐...
事关“收款码”!宁波多地发布预... 最近一段时间我市多地反诈中心接连发布紧急预警提醒市民注意“代转账(付款)”陷阱切莫成了电诈“工具人”...
演员孙俪:中年人没有脆弱的时间... 在电视剧行业,“孙俪”两个字,几乎是品质的代名词。她所塑造的角色,总能在观众心中留下深刻印记。从《甄...
破解科技成果和中小企业需求信息... 每经记者 张蕊    每经编辑 张益铭 “我们希望借助科研院校的力量,提升我们的技...
光大证券:稳就业放在“四稳”之... 格隆汇4月26日|光大证券首席经济学家高瑞东发布4月25日政治局会议精神学习体会。高瑞东认为,短期政...
北京博睿宏远数据科技股份有限公... 公司代码:688229 公司简称:博睿数据北京博睿宏远数据科技股份有限公司2024年年度报告摘要第一...
今日启用!青岛都市圈再添一高标... 青岛都市圈铁路建设项目迎来新进展今日(4月26日)上午9时11分随着G4865次列车驶出日照站客运设...
山东国瓷功能材料股份有限公司2... 证券代码:300285 证券简称:国瓷材料 公告编号:2025-021山东国瓷功能材料股份有限公司...
重点发力中国中央空调市场 P... 转自:新华财经新华财经上海4月26日电(记者 杨有宗)26日,记者从PROFROID全球品牌发布会获...
反复炒作无人机作战 台军有何图... 本文转自【看台海】;近日,台军盛行着一股所谓“无人机制胜论”。民进党当局除了加紧扩充无人机装备外,更...
恒烁半导体(合肥)股份有限公司... 公司代码:688416 公司简称:恒烁股份恒烁半导体(合肥)股份有限公司2024年年度报告摘要第一节...
走马观花的意思是什么 走马观花的意思是什么走马观花,指骑在奔跑的马上看花。原形容事情如意,心境愉快。后多指粗略地观察一下。...
天价离婚!女方分走超3亿 4月25日晚间,鼎信通讯(维权)(SH603421,股价6.09元,市值39.72亿元)发布公告称,...
每斤售价超百元!青岛这种大樱桃... 4月25日,记者在胶州市洋河镇樱之语大樱桃园内看到,露天樱桃花正烂漫绽放,而智能温室大棚内,颗颗红亮...
读者出版传媒股份有限公司202... 公司代码:603999 公司简称:读者传媒本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误...
伊朗南部阿巴斯港港口发生爆炸 总台记者获悉,当地时间26日,伊朗南部阿巴斯港港口发生爆炸。目前爆炸原因不明。(总台记者 李健南)©...
烽火通信科技股份有限公司 (上接1007版)证券代码:600498 证券简称:烽火通信 公告编号:2025-023转债代码:...
开源证券给予江苏金租买入评级,... 开源证券04月26日发布研报称,给予江苏金租(600901.SH,最新价:5.21元)买入评级。评级...
第三品牌杀入A0级纯电赛道 李... 本报记者 方超 石英婧 上海报道在新能源渗透率持续提升大背景下,A0级纯电小车市场正成为巨头竞逐的新...