h软件_Qt编写软件运行时间记录
一、前言
在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编号+开始时间+结束时间+已运行时间,每次完整的运行过程只产生一条记录,每次运行时间改变以后更新当前这条记录即可。这样就可以确切的了解到软件在现场的真实运行情况是否糟糕,如果没有这个记录(当然可以选择记录存储到数据库),程序又重启恢复了,也不知道到底每次运行了多久,从几点到几点。
为了写的简单点,不干扰原有的数据库文件,我一般选择输出到文本文件。目前这边的文章没法贴下载链接等信息,有需要可以留言索要。
二、实现的功能
- 从软件启动后开始计时。
- 统计内容包括编号+开始时间+结束时间+已运行时间。
- 每次软件运行过程只记录一条记录。
- 自动按照年月日命名日志文件。
- 统计间隔可以自由设定。
- 保存目录可以自由设定。
三、效果图
四、完整代码
#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编写软件运行时间记录相关推荐
- php编辑工具绿色,php编写软件下载|
php编写专用工具是一款专用于主页制作的PHP网页制作工具,这款工具不仅小巧方便,而且整款简单易用,感兴趣的用户快来IT猫扑下载吧! php编写软件介绍 phped是一款非常好用且功能强大的专业php ...
- 编写软件时如何偷工减料
We take pride in our craft. As good software developers, we've learned all of the design patterns, a ...
- augustus 软件安装与Docker使用记录
augustus 软件安装与Docker使用记录 augustus:一基因预测软件: Docker:应用容器引擎,可实现虚拟机. 一. 问题:Github下载的augustus难以正常安装及使用 本机 ...
- 工具软件中的一些操作记录
工具软件中的一些操作记录 0. 目的: A. Visio A01.Visio图跨文件复制保持原样 A02.带有公式的visio 插入到word后模糊变形,如何保持原样? B. Windows系统 B0 ...
- 软件工程流程图编写软件_如何编写杀手级软件工程简历
软件工程流程图编写软件 对简历的深入分析使我在Google,Facebook,亚马逊,微软,苹果等公司接受了采访. (An in-depth analysis of the résumé that g ...
- JavaScript 本地对象和内置对象,2018哪个软件可以查车辆出险记录
2018哪个软件可以查车辆出险记录,具体是如何解读车架号知道什么字母代表出厂日期是哪年的呢?我们下面文章就带大家了解下,让你通过车架号就能掌握是否是2019款的车了. 使用车架号可以查询到车辆的基本信 ...
- java培训教程分享:Java编写软件代码自动提示功能
本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...
- tcs标准编写软件_【通知】关于举办2019年第一期“标准编写、案例分析、TCS工具使用”培训班的通知...
各有关单位: 标准编写是开展标准化工作中一个必不可少的重要环节.掌握标准编写规则是制定符合社会经济发展需求.有科技含量.先进适用标准的基础,是提升标准质量和水平的先决条件. 2019年是建设推动高质量 ...
- tcs标准编写软件_【公益培训】知你所需 | 标准编写格式及TCS模板应用线上公益培训...
企业标准编写的水平及TCS工具使用的能力是实施企业标准化工作的基础.TCS标准编写软件是辅助标准编写的工具性软件,方便标准编写人员快捷准确的编写标准草案,有效提升标准供给质量. 为贯彻落实疫情防控和助 ...
最新文章
- malloc 和alloc及calloc的区别
- 预发布环境,Tag发布机制和可重复的部署过程
- Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介、安装、使用方法详细攻略—案例之实现机器人在线24小时智能翻译
- Word 邮件合并中的域的格式的2个小定义
- npm run dev 和 npx webpack-dev-server
- java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
- 页面调用系统window打印
- android studio -genymotion神奇错误
- Airbnb React/JSX 编码规范
- C#中为ComboBox设定value值
- python用时间戳给文件命名-在Python中每小时将时间戳记写入文件
- MD5 与 Base64一起使用 加密,计算原理
- AMPL 简单运输模型
- 扫描全能王文件上传不了服务器,如何将扫描全能王的文档轻松保存到坚果云?...
- ROS:TF,机器人坐标管理神器
- 华为前端社招OD面试(已拿offer)
- 开灯问题 算法竞赛 (注释详细)
- phonegap app推送新手教程与坑
- html怎么设置取消隐藏,怎么取消wifi隐藏_取消隐藏wifi设置方法-192路由网
- c语言定积分区间微元面积,定积分的微元法.doc