日期:2019-08-22
一、目的:
写一个独立的计时器工具,用于判断某些操作花费的时间长短。
二、要求
1、可以用于多个线程中,记录不同线程中的某个流程的时间。
2、引用方式简单
(头文件导入,变量生成,启动,结束,输出合理的日志信息)
3、
三、实现思路:
1、生成一个对象,并给对象一个唯一的Uuid (?不需要),保存起始时间,但是结束的时候,怎么哪到这个对象呢?也就是说如何做到在任意地方都可以拿到这个计时器对象??
解决方法: 用静态对象或单例的方法解决任意地方使用计时器。
2、 在使用定时器的地方创建一个定时器,并且传入一个唯一的id 标识定时器。(这个定时器id 必须在运行中各不相同才行)
并且这个id 也必须在 停止定时器的地方可以获取得到才行。
之后就根据这个id来管理各个定时器了。
四、源代码
#ifndef TIMERTOOL_H
#define TIMERTOOL_H
#include <QObject>
#include <QMap>
#include <QDateTime>
#include <QDebug>
class COneTimer
{
public:
COneTimer();
~COneTimer();
bool startTimer(QString& qstrErrorInfo);
bool stopTimer(qint64& nTimeInterval, QString& qstrErrorInfo);
private:
//QString m_qstrId; // 该定时器的唯一标识的id
//QString m_qstrOutInfo; //外部定义的输出信息。
qint64 m_nStartTime_t; // 开始时间
qint64 m_nStopTime_t; // 结束时间
};
class CTimerTool : public QObject
{
Q_OBJECT
public:
CTimerTool(QObject *parent = NULL);
~CTimerTool();
static CTimerTool* getSingleTimerTool()
{
static CTimerTool timerTool;
return &timerTool;
}
// 创建一个定时器,传入该定时器一个标识的唯一id
bool createOneTimer(const QString qstrId, QString& qstrErrorInfo);
// 启动对应的定时器
bool startTimerById(const QString qstrId, QString& qstrErrorInfo, bool bPrintInfo = false);
// 停止对应的定时器
bool stopTimerById(const QString qstrId, qint64& nTimeInterval, QString& qstrErrorInfo);
private:
void printErrorInfo(const QString qstrErrorInfo, bool bPrintInfo);
private:
QMap<QString, COneTimer*> m_mapId2Timer;
};
#endif // TIMERTOOL_H
#include "TimerTool.h"
CTimerTool::CTimerTool(QObject *parent)
: QObject(parent)
{
}
CTimerTool::~CTimerTool()
{
}
bool CTimerTool::createOneTimer(const QString qstrId, QString& qstrErrorInfo)
{
if (m_mapId2Timer.contains(qstrId))
{
qstrErrorInfo = QStringLiteral("该id已经存在了,请通过get方法获取。");
return false;
}
COneTimer *pOneTimer = new COneTimer();
if (NULL == pOneTimer)
{
qstrErrorInfo = QStringLiteral("生成定时器失败!");
return false;
}
m_mapId2Timer.insert(qstrId, pOneTimer);
qstrErrorInfo = QStringLiteral("生成定时器成功!");
return true;
}
bool CTimerTool::startTimerById(const QString qstrId, QString& qstrErrorInfo, bool bPrintInfo /*= false*/)
{
if (!m_mapId2Timer.contains(qstrId))
{
qstrErrorInfo = QStringLiteral("该id没有对应的定时器!");
printErrorInfo(qstrErrorInfo,bPrintInfo);
return false;
}
COneTimer* pOneTimer = m_mapId2Timer.value(qstrId);
if (NULL == pOneTimer)
{
qstrErrorInfo = QStringLiteral("该id对应的定时器是空的!");
printErrorInfo(qstrErrorInfo, bPrintInfo);
return false;
}
printErrorInfo(qstrErrorInfo, bPrintInfo);
return pOneTimer->startTimer(qstrErrorInfo);
}
bool CTimerTool::stopTimerById(const QString qstrId, qint64& nTimeInterval, QString& qstrErrorInfo)
{
if (!m_mapId2Timer.contains(qstrId))
{
qstrErrorInfo = QStringLiteral("该id没有对应的定时器!");
return false;
}
COneTimer* pOneTimer = m_mapId2Timer.value(qstrId);
if (NULL == pOneTimer)
{
qstrErrorInfo = QStringLiteral("该id对应的定时器是空的!");
return false;
}
return pOneTimer->stopTimer(nTimeInterval, qstrErrorInfo);
}
void CTimerTool::printErrorInfo(const QString qstrErrorInfo, bool bPrintInfo)
{
if (bPrintInfo)
{
qDebug() << qstrErrorInfo << endl;
}
}
//COneTimer类的定义部分
COneTimer::COneTimer()
: m_nStartTime_t(0)
, m_nStopTime_t(0)
{
}
COneTimer::~COneTimer()
{
}
bool COneTimer::startTimer(QString& qstrErrorInfo)
{
m_nStartTime_t = QDateTime::currentDateTime().toMSecsSinceEpoch();
qstrErrorInfo = QStringLiteral("启动计时器成功!");
return true;
}
bool COneTimer::stopTimer(qint64& nTimeInterval, QString& qstrErrorInfo)
{
m_nStopTime_t = QDateTime::currentDateTime().toMSecsSinceEpoch();
if (0 == m_nStartTime_t)
{
qstrErrorInfo = QStringLiteral("该计时器没有启动或启动成功!");
return false;
}
nTimeInterval = m_nStopTime_t - m_nStartTime_t;
qstrErrorInfo = QStringLiteral("停止计时器成功!");
return true;
}
#include "Common/TimerTool.h"
QString qstrErrorInfo = "";
QString qstrTimerId = qstrChnlIndex + QString::number(nControlType);
CTimerTool::getSingleTimerTool()->createOneTimer(qstrChnlIndex, qstrErrorInfo);
CTimerTool::getSingleTimerTool()->startTimerById(qstrChnlIndex, qstrErrorInfo);
。。。。。
。。。。。
qint64 nTimerInterval = 0;
CTimerTool::getSingleTimerTool()->stopTimerById(qstrChnlIndex, nTimerInterval, qstrErrorInfo);
qDebug() << QStringLiteral("当前耗时 : zbs :") << nControlType << " " << nTimerInterval / 1000.0 << " " << QStringLiteral("秒") << " " << qstrErrorInfo << endl;