• 5534阅读
  • 4回复

Qt编写软件运行时间记录(开源) [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2019-03-10
在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编号+开始时间+结束时间+已运行时间,每次完整的运行过程只产生一条记录,每次运行时间改变以后更新当前这条记录即可。这样就可以确切的了解到软件在现场的真实运行情况是否糟糕,如果没有这个记录(当然可以选择记录存储到数据),程序又重启恢复了,也不知道到底每次运行了多久,从几点到几点。
为了写的简单点,不干扰原有的数据库文件,我一般选择输出到文本文件。
完整代码下载 saveruntime.zip (6 K) 下载次数:405
完整代码:
  1. #ifndef SAVERUNTIME_H
  2. #define SAVERUNTIME_H
  3. #include <QObject>
  4. #include <QDateTime>
  5. class QTimer;
  6. #ifdef quc
  7. #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
  8. #include <QtDesigner/QDesignerExportWidget>
  9. #else
  10. #include <QtUiPlugin/QDesignerExportWidget>
  11. #endif
  12. class QDESIGNER_WIDGET_EXPORT SaveRunTime : public QObject
  13. #else
  14. class SaveRunTime : public QObject
  15. #endif
  16. {
  17.     Q_OBJECT
  18. public:
  19.     static SaveRunTime *Instance();
  20.     explicit SaveRunTime(QObject *parent = 0);
  21. private:
  22.     static QScopedPointer<SaveRunTime> self;
  23.     QString path;       //日志文件路径
  24.     QString name;       //日志文件名称
  25.     int lastID;
  26.     int saveInterval;
  27.     QDateTime startTime;
  28.     QString logFile;
  29.     QTimer *timerSave;
  30. private:
  31.     void getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute);
  32. signals:
  33. public slots:
  34.     void start();       //启动服务
  35.     void stop();        //停止服务
  36.     void initLog();     //初始化日志文件
  37.     void appendLog();   //追加一条记录到日志文件
  38.     void saveLog();     //保存运行时间到日志文件
  39.     void setPath(const QString &path);
  40.     void setName(const QString &name);
  41.     void setSaveInterval(int saveInterval);
  42. };
  43. #endif // SAVERUNTIME_H
  44. #include "saveruntime.h"
  45. #include "qmutex.h"
  46. #include "qapplication.h"
  47. #include "qtimer.h"
  48. #include "qfile.h"
  49. #include "qtextstream.h"
  50. #include "qstringlist.h"
  51. #include "qdebug.h"
  52. #ifdef Q_OS_WIN
  53. #define NEWLINE "\r\n"
  54. #else
  55. #define NEWLINE "\n"
  56. #endif
  57. QScopedPointer<SaveRunTime> SaveRunTime::self;
  58. SaveRunTime *SaveRunTime::Instance()
  59. {
  60.     if (self.isNull()) {
  61.         QMutex mutex;
  62.         QMutexLocker locker(&mutex);
  63.         if (self.isNull()) {
  64.             self.reset(new SaveRunTime);
  65.         }
  66.     }
  67.     return self.data();
  68. }
  69. SaveRunTime::SaveRunTime(QObject *parent) : QObject(parent)
  70. {
  71.     path = qApp->applicationDirPath();
  72.     QString str = qApp->applicationFilePath();
  73.     QStringList list = str.split("/");
  74.     name = list.at(list.count() - 1).split(".").at(0);
  75.     saveInterval = 1 * 60 * 1000;
  76.     startTime = QDateTime::currentDateTime();
  77.     timerSave = new QTimer(this);
  78.     timerSave->setInterval(saveInterval);
  79.     connect(timerSave, SIGNAL(timeout()), this, SLOT(saveLog()));
  80. }
  81. void SaveRunTime::start()
  82. {
  83.     timerSave->start();
  84.     initLog();
  85.     appendLog();
  86.     saveLog();
  87. }
  88. void SaveRunTime::stop()
  89. {
  90.     timerSave->stop();
  91. }
  92. void SaveRunTime::getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute)
  93. {
  94.     qint64 sec = startTime.secsTo(endTime);
  95.     day = hour = minute = 0;
  96.     int seconds = 0;
  97.     while (sec > 0) {
  98.         seconds++;
  99.         if (seconds == 60) {
  100.             minute++;
  101.             seconds = 0;
  102.         }
  103.         if (minute == 60) {
  104.             hour++;
  105.             minute = 0;
  106.         }
  107.         if (hour == 24) {
  108.             day++;
  109.             hour = 0;
  110.         }
  111.         sec--;
  112.     }
  113. }
  114. void SaveRunTime::initLog()
  115. {
  116.     //判断当前年份的记事本文件是否存在,不存在则新建并且写入标题
  117.     //存在则自动读取最后一行的id号  记事本文件格式内容
  118.     //编号    开始时间                结束时间                已运行时间
  119.     //1      2016-01-01 12:33:33    2016-02-05 12:12:12     day: 0  hour: 0  minute: 0
  120.     logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
  121.     QFile file(logFile);
  122.     if (file.size() == 0) {
  123.         if (file.open(QFile::WriteOnly | QFile::Text)) {
  124.             QString strID = QString("%1\t").arg("编号");
  125.             QString strStartTime = QString("%1\t\t").arg("开始时间");
  126.             QString strEndTime = QString("%1\t\t").arg("结束时间");
  127.             QString strRunTime = QString("%1").arg("已运行时间");
  128.             QString line = strID + strStartTime + strEndTime + strRunTime;
  129.             QTextStream stream(&file);
  130.             stream << line << NEWLINE;
  131.             file.close();
  132.             lastID = 0;
  133.         }
  134.     } else {
  135.         if (file.open(QFile::ReadOnly)) {
  136.             QString lastLine;
  137.             while (!file.atEnd()) {
  138.                 lastLine = file.readLine();
  139.             }
  140.             file.close();
  141.             QStringList list = lastLine.split("\t");
  142.             lastID = list.at(0).toInt();
  143.         }
  144.     }
  145.     lastID++;
  146. }
  147. void SaveRunTime::appendLog()
  148. {
  149.     logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
  150.     QFile file(logFile);
  151.     //写入当前首次运行时间
  152.     if (file.open(QFile::WriteOnly | QFile::Append | QFile::Text)) {
  153.         QString strID = QString("%1\t").arg(lastID);
  154.         QString strStartTime = QString("%1\t").arg(startTime.toString("yyyy-MM-dd HH:mm:ss"));
  155.         QString strEndTime = QString("%1\t").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
  156.         int day, hour, minute;
  157.         getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute);
  158.         QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute);
  159.         QString line = strID + strStartTime + strEndTime + strRunTime;
  160.         QTextStream stream(&file);
  161.         stream << line << NEWLINE;
  162.         file.close();
  163.     }
  164. }
  165. void SaveRunTime::saveLog()
  166. {
  167.     //每次保存都是将之前的所有文本读取出来,然后替换最后一行即可
  168.     logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year());
  169.     QFile file(logFile);
  170.     //如果日志文件不存在,则初始化一个日志文件
  171.     if (file.size() == 0) {
  172.         initLog();
  173.         appendLog();
  174.         return;
  175.     }
  176.     if (file.open(QFile::ReadWrite)) {
  177.         //一行行读取到链表
  178.         QStringList content;
  179.         while (!file.atEnd()) {
  180.             content.append(file.readLine());
  181.         }
  182.         //重新清空文件
  183.         file.resize(0);
  184.         //如果行数小于2则返回
  185.         if (content.count() < 2) {
  186.             file.close();
  187.             return;
  188.         }
  189.         QString lastLine = content.last();
  190.         QStringList list = lastLine.split("\t");
  191.         //计算已运行时间
  192.         int day, hour, minute;
  193.         getDiffValue(startTime, QDateTime::currentDateTime(), day, hour, minute);
  194.         QString strRunTime = QString("%1 天 %2 时 %3 分").arg(day).arg(hour).arg(minute);
  195.         //重新拼接最后一行
  196.         list[2] = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
  197.         list[3] = strRunTime;
  198.         lastLine = list.join("\t");
  199.         //重新替换最后一行并写入新的数据
  200.         content[content.count() - 1] = lastLine;
  201.         QTextStream stream(&file);
  202.         stream << content.join("") << NEWLINE;
  203.         file.close();
  204.     }
  205. }
  206. void SaveRunTime::setPath(const QString &path)
  207. {
  208.     if (this->path != path) {
  209.         this->path = path;
  210.     }
  211. }
  212. void SaveRunTime::setName(const QString &name)
  213. {
  214.     if (this->name != name) {
  215.         this->name = name;
  216.     }
  217. }
  218. void SaveRunTime::setSaveInterval(int saveInterval)
  219. {
  220.     if (this->saveInterval != saveInterval) {
  221.         this->saveInterval = saveInterval;
  222.         timerSave->setInterval(saveInterval);
  223.     }
  224. }



欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
在线圣域天子

只看该作者 1楼 发表于: 2019-03-10
用守护进程,加个时间纪录不就可以了吗?
离线liudianwu

只看该作者 2楼 发表于: 2019-03-10
回 圣域天子 的帖子
圣域天子:用守护进程,加个时间纪录不就可以了吗? (2019-03-10 21:42) 

还没睡啊版主,注意身体啊,年轻人,少熬夜!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线liuchangyin

只看该作者 3楼 发表于: 2019-03-11
都是实战经验
离线ccazqyy

只看该作者 4楼 发表于: 2019-03-12
            
快速回复
限100 字节
 
上一个 下一个