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

最后 🐶狗头保命

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

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

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...