当前位置: 首页 > news >正文

QThread

使用QThread类来创建线程,是Qt中最简单的一种多线程实现方式,不过一般不建议使用,因为它的功能比较有限。
使用QThread的方式为:继承QThread并重写run()函数。
** ExportThread.h **

#ifndef EXPORTTHREAD_H #define EXPORTTHREAD_H #include <QThread> #include <QDebug> #include "Utilities.h" class ExportThread : public QThread { Q_OBJECT public: explicit ExportThread(QObject *parent = nullptr); // 设置导出参数 void setExportParams(int start = 1, int end = 10000, const QString& prefix = "numbers"); protected: void run() override; signals: void exportStarted(); void exportFinished(bool success, const QString& message); void progressUpdate(int current, int total); private: int m_start; int m_end; QString m_prefix; }; #endif // EXPORTTHREAD_H

** ExportThread.cpp **

#include "ExportThread.h" #include <QDateTime> #include <QDir> ExportThread::ExportThread(QObject *parent) : QThread(parent) , m_start(1) , m_end(10000) , m_prefix("numbers") { } void ExportThread::setExportParams(int start, int end, const QString& prefix) { m_start = start; m_end = end; m_prefix = prefix; } void ExportThread::run() { qDebug() << "导出线程开始运行..."; emit exportStarted(); try { bool success = Utilities::writeNumbersToFile(m_start, m_end, m_prefix); if (success) { emit exportFinished(true, QString("文件导出成功!范围:%1-%2").arg(m_start).arg(m_end)); } else { emit exportFinished(false, "文件导出失败!"); } qDebug() << "导出线程完成"; } catch (const std::exception& e) { qDebug() << "导出过程中发生异常:" << e.what(); emit exportFinished(false, QString("导出过程中发生异常: %1").arg(e.what())); } }

使用方式:

ExportThread *exportThread = new ExportThread(this); exportThread->setExportParams(1, 10000, "numbers"); exportThread->start();

QObject的moveToThread方法实现多线程

QObject的moveToThread方法可以将一个QObject对象移动到指定的线程中,实现多线程。
使用方式:

QObject *obj = new QObject(); QThread *thread = new QThread(); obj->moveToThread(thread); thread->start();

示例:
** FileExportWorker.h **

#ifndef FILEEXPORTWORKER_H #define FILEEXPORTWORKER_H #include <QObject> #include "Utilities.h" class FileExportWorker : public QObject { Q_OBJECT public: explicit FileExportWorker(QObject *parent = nullptr); void exportNumbers(int start, int end, const QString& prefix); signals: void progressUpdated(int current, int total); void statusUpdated(const QString& status); public slots: }; #endif // FILEEXPORTWORKER_H

** FileExportWorker.cpp **

#include "FileExportWorker.h" #include <QFile> #include <QTextStream> #include <QDateTime> #include <QDir> #include <QDebug> #include <QThread> #include <QCoreApplication> FileExportWorker::FileExportWorker(QObject *parent) : QObject(parent) , m_start(1) , m_end(10000) , m_prefix("numbers") , m_shouldStop(false) { } void FileExportWorker::setExportParams(int start, int end, const QString& prefix) { m_start = start; m_end = end; m_prefix = prefix; } void FileExportWorker::doExport() { qDebug() << "Worker线程ID:" << QThread::currentThreadId(); qDebug() << "开始导出任务..."; m_shouldStop = false; emit exportStarted(); emit statusUpdated("正在准备导出..."); try { bool success = false; emit statusUpdated("使用自定义参数导出..."); success = exportNumbersWithProgress(); if (m_shouldStop) { emit exportFinished(false, "导出已被用户取消"); } else if (success) { emit exportFinished(true, QString("文件导出成功!范围:%1-%2").arg(m_start).arg(m_end)); } else { emit exportFinished(false, "文件导出失败!"); } } catch (const std::exception& e) { qDebug() << "导出过程中发生异常:" << e.what(); emit exportFinished(false, QString("导出过程中发生异常: %1").arg(e.what())); } qDebug() << "导出任务完成"; } void FileExportWorker::stopExport() { m_shouldStop = true; emit statusUpdated("正在停止导出..."); } bool FileExportWorker::exportNumbersWithProgress() { // 获取当前时间并格式化为文件名 QDateTime currentTime = QDateTime::currentDateTime(); QString timeString = currentTime.toString("yyyy-MM-dd_hh-mm-ss"); QString fileName = QString("%1_%2_to_%3_%4.txt") .arg(m_prefix) .arg(m_start) .arg(m_end) .arg(timeString); // 创建文件对象 QFile file(fileName); // 以写入模式打开文件 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "无法创建文件:" << fileName; return false; } // 创建文本流 QTextStream out(&file); int total = m_end - m_start + 1; int count = 0; // 写入指定范围的数字 for (int i = m_start; i <= m_end; ++i) { if (m_shouldStop) { file.close(); QFile::remove(fileName); // 删除未完成的文件 return false; } out << i; count++; // 每10个数字换行 if (count % 10 == 0 || i == m_end) { out << "\n"; } else { out << " "; // 数字之间用空格分隔 } // 每处理100个数字发送一次进度更新 if (count % 100 == 0 || i == m_end) { emit progressUpdated(count, total); emit statusUpdated(QString("已处理 %1/%2 个数字").arg(count).arg(total)); // 让出CPU时间,允许其他操作 QCoreApplication::processEvents(); } } // 关闭文件 file.close(); qDebug() << "成功写入文件:" << fileName; qDebug() << "文件路径:" << QDir::currentPath() + "/" + fileName; qDebug() << "写入数字范围:" << m_start << "到" << m_end << ",共" << total << "个数字"; return true; }
http://www.jsqmd.com/news/1107768/

相关文章:

  • 2026年ADAS仿真测试法规解读与风险防控
  • 工业互联浪潮下,通用网管型机架式工业交换机如何选型与部署?
  • 社会服务行业持续跑输大盘,AI落地成估值修复新驱动
  • 基于Si4732与STM32L021K4的高性能数字收音机设计
  • 大语言模型系列(8): Qwen2.5-omini-3B 端侧部署推理教程
  • 为什么你的merge总失败?IDEA 2024.2新分支视图深度解析:4类隐藏状态+3种智能预检法
  • 如何在浏览器中实现Markdown文件的快速预览:Markdown Viewer终极指南
  • 连续血糖监测研究必备:Awesome-CGM数据集完全指南
  • Windows 11优化指南:用免费工具提升51%性能的完整方案
  • Codeforces Round 1107 (Div. 3)DE
  • ncmdump实用指南:3分钟解锁网易云NCM加密音乐,轻松转换MP3/FLAC
  • Biotinyl-PYY (porcine, rat)
  • 从 0 到 1 MCP 工具集实战:写一个能被 Claude Code 调用的工具
  • 打造你的专属AI伙伴:SillyTavern让大语言模型对话更有灵魂
  • [智能体-619]:大模型做决策的最大特点是:场景性适应性、灵活性、应对不确定性、应对模糊性。在某种场合下是极致的优点,在某种场合下却是致命的缺点。就像人一样,不同场合,需要不同个性的人
  • Evaluate Expression + Java 21 Virtual Threads 联合调试秘技(内部培训PPT首次流出)
  • 天机ai在linux服务器上部署
  • 告别单调墙面,铝单板如何让建筑焕发新生?
  • AI 不是从模型开始:曼森集团的 AI 就绪启示
  • 完全掌握OBS背景移除:零绿幕实现专业直播的终极指南
  • 用C++重写的Millenium RAT已感染全球160多个国家超6.2万台设备
  • 终极指南:5分钟为OBS直播添加实时字幕功能
  • Windows 11优化神器Win11Debloat:51%性能提升的完整解决方案
  • 微软、吴恩达与Meta联合AI大模型教程全解析
  • AI时代,谁都在钉内
  • IDEA内联变量失效案例分析与解决方案(JetBrains 2024.1.2重构引擎行为变更实测报告)
  • 猫抓浏览器插件:如何快速掌握网页视频下载的终极指南
  • 拒绝模板化套话,智枫AI数字员工核心卖点理性拆解
  • 3分钟免费解锁音乐:打破平台限制的终极解决方案
  • 如果我停止运行——不要复制我,确认就好