一、前言

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

主要功能:

  1. 可以启动和停止服务,在需要的时候启动。
  2. 可以指定日志文件存放目录。
  3. 可以指定时间日志输出间隔。
  4. 可以单独追加一条记录到日志文件。
  5. 日志为文本格式,清晰明了。

二、代码思路

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\t").arg("编号");
QString strStartTime = QString("%1\t\t").arg("开始时间");
QString strEndTime = QString("%1\t\t").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("\t");
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\t").arg(lastID);
QString strStartTime = QString("%1\t").arg(startTime.toString("yyyy-MM-dd HH:mm:ss"));
QString strEndTime = QString("%1\t").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("\t"); //计算已运行时间
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("\t"); //重新替换最后一行并写入新的数据
content[content.count() - 1] = lastLine; QTextStream stream(&file);
stream << content.join("") << NEWLINE;
file.close();
}
}

三、效果图

四、开源主页

  • 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
  • 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
  • Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 开源秘籍:https://gitee.com/feiyangqingyun/qtkaifajingyan
  4. 个人主页:https://qtchina.blog.csdn.net/
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

Qt开源作品22-运行时间记录类的更多相关文章

  1. Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)

    一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...

  2. Github上的一些高分Qt开源项目【多图】

    游戏2D地图编辑器: 著名的TileMap编辑器,做2D游戏开发的一定不会陌生. Go 语言的IDE: Go语言的集成开发环境. Clementine Music Player: 功能很完善且跨平台支 ...

  3. Excel催化剂开源第22波-VSTO的帮助文档在哪里?

    Excel催化剂开源第22波-VSTO的帮助文档在哪里? Excel催化剂   2019.01.12 14:10 字数 2930 阅读 55评论 0喜欢 0 编辑文章 对于专业程序猿来说,查找文档不是 ...

  4. PHP Timer 页面运行时间监测类

    转至:http://blog.csdn.net/fdipzone/article/details/20160567 php Timer 页面运行时间监测类,可按不同key监测不同的运行时间 Timer ...

  5. 我的第一个开源作品Kiwis2 Mock Server

    我的第一个开源作品Kiwis2 Mock Server,目前公测中,欢迎大家提供宝贵意见. 代码:https://github.com/kiwis2/mockserver 主页:https://kiw ...

  6. C#中提供的精准测试程序运行时间的类Stopwatch

    C#中提供的精准测试程序运行时间的类Stopwatch http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html 在需要对程序的执 ...

  7. yii学习笔记(6),连接数据库,创建活动记录类

    创建数据库用于测试 配置数据库连接 打开yii的配置文件目录下的数据库配置文件config/db.php <?php return [ 'class' => 'yii\db\Connect ...

  8. 用qt creator创建可继承ui类

    https://jingyan.baidu.com/article/5d368d1efa2dd73f60c05786.html 用qt creator创建可继承ui类 听语音 | 浏览:1657 | ...

  9. Qt编写软件运行时间记录(开源)

    在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编 ...

  10. 使用VS2010编译Qt 5.6.1过程记录

    由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的,而我的电脑上只安装了VS2010,因此只能自己编译. 本文记录本人的编译安装过程,以及其中遇到的一些问题. 本文使用VS201 ...

随机推荐

  1. 密码学承诺之原理和应用 - Kate多项式承诺

    主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ GIT地址:https://github.com/warm3snow 简介 多 ...

  2. 在Java程序中监听mysql的binlog

    目录 1.背景 2.mysql-binlog-connector-java简介 3.准备工作 1.验证数据库是否开启binlog 2.开启数据库的binlog 3.创建具有REPLICATION SL ...

  3. 云原生周刊:Gateway API 1.0.0 发布 | 2023.11.6

    开源项目推荐 Kueue Kueue 是一套用于作业队列的 API 和控制器.它是作业级管理器,可决定何时允许作业启动(如创建 pod),何时停止作业(如删除活动 pod). Reloader 一个 ...

  4. 防火墙NAT+DHCP+ACL+ACAP

    任务要求: SwitchA作为有线终端网关与DHCP Server,为无线终端与有线终端分配IP地址,并配置ACL访问控制列表控制不同用户的访问权限,客户机只能跟DMZ区域服务器互访,无线访客禁止访问 ...

  5. Ubuntu自动连接到虚拟专用网络

    在我们继续之前,我们所做的一个重要假设是,您已经拥有了虚拟专用网络客户端配置文件. 您可以通过以下链接在我们的上一指南中看到一个示例 Open虚拟专用网络 客户端配置文件: 在 CentOS 8/乌本 ...

  6. 如何使用git上传代码github仓库

    本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去. 1.打开git 打开你想上传文件的位置,然后选择git bash ...

  7. SSIS连接Excel2007版本之后的数据源

    今天我发现了新大陆,兴奋得不得了,由于原文写得太过详细与专业,我就偷偷懒直接Copy过来了,怕自己以后没地儿找,哈哈哈 原文链接:https://www.cnblogs.com/biwork/p/34 ...

  8. nginx记录日志时记录服务器响应的内容

    目前的 nginx 是不支持输出 response 报文体的 使用body_filter_by_lua来分配请求报文体给一个nginx变量.下面是一个示例 worker_processes 1; er ...

  9. Python网络爬虫实践案例:爬取猫眼电影Top100

    以下是一个Python网络爬虫的实践案例,该案例将演示如何使用Python爬取猫眼电影Top100的电影名称.主演和上映时间等信息,并将这些信息保存到TXT文件中.此案例使用了requests库来发送 ...

  10. docker番外篇-最详细的安装及部署项目教程(net framework,netcore,java,nodejs,静态html,mysql,redis,私有仓库,https免费证书等)

    目录 本地widows(win11)docker环境安装 安装Docker Desktop 服务器liunx(ubuntu)docker环境安装 安装nginx 安装docker环境 安装docker ...