时间软件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 \"\r\n\"#else#define NEWLINE \"\n\"#endifQScopedPointer<SaveRunTime> 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\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(); }}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); }}
时间软件Qt(时间软件青云文件结束时间)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息