【Qt】【功能】写一个独立的计时器工具,用于判断某些操作花费的时间长短。

日期: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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值