一、前言

在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编号+开始时间+结束时间+已运行时间,每次完整的运行过程只产生一条记录,每次运行时间改变以后更新当前这条记录即可。这样就可以确切的了解到软件在现场的真实运行情况是否糟糕,如果没有这个记录(当然可以选择记录存储到数据库),程序又重启恢复了,也不知道到底每次运行了多久,从几点到几点。

为了写的简单点,不干扰原有的数据库文件,我一般选择输出到文本文件。目前这边的文章没法贴下载链接等信息,有需要可以留言索要。

二、实现的功能

  1. 从软件启动后开始计时。
  2. 统计内容包括编号+开始时间+结束时间+已运行时间。
  3. 每次软件运行过程只记录一条记录。
  4. 自动按照年月日命名日志文件。
  5. 统计间隔可以自由设定。
  6. 保存目录可以自由设定。

三、效果图

四、完整代码

#include "saveruntime.h"#include "qmutex.h"#include "qapplication.h"#include "qtimer.h"#include "qfile.h"#include "qtextstream.h"#include "qstringlist.h"#ifdef Q_OS_WIN#define NEWLINE ""#else#define NEWLINE ""#endifQScopedPointer SaveRunTime::self;SaveRunTime *SaveRunTime::Instance(){ if (self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if (self.isNull()) { self.reset(new SaveRunTime); } } return self.data();}SaveRunTime::SaveRunTime(QObject *parent) : QObject(parent){ path = qApp->applicationDirPath(); QString str = qApp->applicationFilePath(); QStringList list = str.split("/"); name = list.at(list.count() - 1).split(".").at(0); saveInterval = 1 * 60 * 1000; startTime = QDateTime::currentDateTime(); timerSave = new QTimer(this); timerSave->setInterval(saveInterval); connect(timerSave, SIGNAL(timeout()), this, SLOT(saveLog()));}void SaveRunTime::start(){ timerSave->start(); initLog(); appendLog(); saveLog();}void SaveRunTime::stop(){ timerSave->stop();}void SaveRunTime::getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute){ qint64 sec = startTime.secsTo(endTime); day = hour = minute = 0; int seconds = 0; while (sec > 0) { seconds++; if (seconds == 60) { minute++; seconds = 0; } if (minute == 60) { hour++; minute = 0; } if (hour == 24) { day++; hour = 0; } sec--; }}void SaveRunTime::initLog(){ //判断当前年份的记事本文件是否存在,不存在则新建并且写入标题 //存在则自动读取最后一行的id号 记事本文件格式内容 //幢号 开始时间 结束时间 已运行时间 //1 2016-01-01 12:33:33 2016-02-05 12:12:12 day: 0 hour: 0 minute: 0 logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); if (file.size() == 0) { if (file.open(QFile::WriteOnly | QFile::Text)) { QString strID = QString("%1").arg("编号"); QString strStartTime = QString("%1").arg("开始时间"); QString strEndTime = QString("%1").arg("结束时间"); QString strRunTime = QString("%1").arg("已运行时间"); QString line = strID + strStartTime + strEndTime + strRunTime; QTextStream stream(&file); stream << line << NEWLINE; file.close(); lastID = 0; } } else { if (file.open(QFile::ReadOnly)) { QString lastLine; while (!file.atEnd()) { lastLine = file.readLine(); } file.close(); QStringList list = lastLine.split(""); lastID = list.at(0).toInt(); } } lastID++;}void SaveRunTime::appendLog(){ logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); //写入当前首次运行时间 if (file.open(QFile::WriteOnly | QFile::Append | QFile::Text)) { QString strID = QString("%1").arg(lastID); QString strStartTime = QString("%1").arg(startTime.toString("yyyy-MM-dd HH:mm:ss")); QString strEndTime = QString("%1").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); int day, hour, minute; getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute); QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute); QString line = strID + strStartTime + strEndTime + strRunTime; QTextStream stream(&file); stream << line << NEWLINE; file.close(); }}void SaveRunTime::saveLog(){ //每次保存都是将之前的所有文本读取出来,然后替换最后一行即可 logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); //如果日志文件不存在,则初始化一个日志文件 if (file.size() == 0) { initLog(); appendLog(); return; } if (file.open(QFile::ReadWrite)) { //一行行读取到链表 QStringList content; while (!file.atEnd()) { content.append(file.readLine()); } //重新清空文件 file.resize(0); //如果行数小于2则返回 if (content.count() < 2) { file.close(); return; } QString lastLine = content.last(); QStringList list = lastLine.split(""); //计算已运行时间 int day, hour, minute; getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute); QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute); //重新拼接最后一行 list[2] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"); list[3] = strRunTime; lastLine = list.join(""); //重新替换最后一行并写入新的数据 content[content.count() - 1] = lastLine; QTextStream stream(&file); stream << content.join("") << NEWLINE; file.close(); }}void SaveRunTime::setPath(const QString &path){ if (this->path != path) { this->path = path; }}void SaveRunTime::setName(const QString &name){ if (this->name != name) { this->name = name; }}void SaveRunTime::setSaveInterval(int saveInterval){ if (this->saveInterval != saveInterval) { this->saveInterval = saveInterval; timerSave->setInterval(saveInterval); }}

h软件_Qt编写软件运行时间记录相关推荐

  1. php编辑工具绿色,php编写软件下载|

    php编写专用工具是一款专用于主页制作的PHP网页制作工具,这款工具不仅小巧方便,而且整款简单易用,感兴趣的用户快来IT猫扑下载吧! php编写软件介绍 phped是一款非常好用且功能强大的专业php ...

  2. 编写软件时如何偷工减料

    We take pride in our craft. As good software developers, we've learned all of the design patterns, a ...

  3. augustus 软件安装与Docker使用记录

    augustus 软件安装与Docker使用记录 augustus:一基因预测软件: Docker:应用容器引擎,可实现虚拟机. 一. 问题:Github下载的augustus难以正常安装及使用 本机 ...

  4. 工具软件中的一些操作记录

    工具软件中的一些操作记录 0. 目的: A. Visio A01.Visio图跨文件复制保持原样 A02.带有公式的visio 插入到word后模糊变形,如何保持原样? B. Windows系统 B0 ...

  5. 软件工程流程图编写软件_如何编写杀手级软件工程简历

    软件工程流程图编写软件 对简历的深入分析使我在Google,Facebook,亚马逊,微软,苹果等公司接受了采访. (An in-depth analysis of the résumé that g ...

  6. JavaScript 本地对象和内置对象,2018哪个软件可以查车辆出险记录

    2018哪个软件可以查车辆出险记录,具体是如何解读车架号知道什么字母代表出厂日期是哪年的呢?我们下面文章就带大家了解下,让你通过车架号就能掌握是否是2019款的车了. 使用车架号可以查询到车辆的基本信 ...

  7. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  8. tcs标准编写软件_【通知】关于举办2019年第一期“标准编写、案例分析、TCS工具使用”培训班的通知...

    各有关单位: 标准编写是开展标准化工作中一个必不可少的重要环节.掌握标准编写规则是制定符合社会经济发展需求.有科技含量.先进适用标准的基础,是提升标准质量和水平的先决条件. 2019年是建设推动高质量 ...

  9. tcs标准编写软件_【公益培训】知你所需 | 标准编写格式及TCS模板应用线上公益培训...

    企业标准编写的水平及TCS工具使用的能力是实施企业标准化工作的基础.TCS标准编写软件是辅助标准编写的工具性软件,方便标准编写人员快捷准确的编写标准草案,有效提升标准供给质量. 为贯彻落实疫情防控和助 ...

最新文章

  1. malloc 和alloc及calloc的区别
  2. 预发布环境,Tag发布机制和可重复的部署过程
  3. Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介、安装、使用方法详细攻略—案例之实现机器人在线24小时智能翻译
  4. Word 邮件合并中的域的格式的2个小定义
  5. npm run dev 和 npx webpack-dev-server
  6. java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
  7. 页面调用系统window打印
  8. android studio -genymotion神奇错误
  9. Airbnb React/JSX 编码规范
  10. C#中为ComboBox设定value值
  11. python用时间戳给文件命名-在Python中每小时将时间戳记写入文件
  12. MD5 与 Base64一起使用 加密,计算原理
  13. AMPL 简单运输模型
  14. 扫描全能王文件上传不了服务器,如何将扫描全能王的文档轻松保存到坚果云?...
  15. ROS:TF,机器人坐标管理神器
  16. 华为前端社招OD面试(已拿offer)
  17. 开灯问题 算法竞赛 (注释详细)
  18. phonegap app推送新手教程与坑
  19. html怎么设置取消隐藏,怎么取消wifi隐藏_取消隐藏wifi设置方法-192路由网
  20. c语言定积分区间微元面积,定积分的微元法.doc

热门文章

  1. MODBUS RTU 协议读卡器
  2. 2022-2028全球军用弩行业调研及趋势分析报告
  3. 山东大学软件工程期末复习知识点总结
  4. 技术人员的职业发展规划思考书单推荐
  5. uber司机已经激活了,就是还没有上传头
  6. 贝叶斯法则的举例分析
  7. 简图记录-GAMMA技术基础
  8. 个性和共性,对共性的封装。新的语言是如何诞生的
  9. oracle 表字段拆分,oracle 字段拆分
  10. 卡尔曼滤波最完整公式推导