一、学到的知识
- 计时器的简易实现
- 优化了注释,统一使用
多行注释
,减少思考 - 使用
Copyright Moota, Private. All Rights Reserved.
进行版权说明 - 学习了计时器的各个状态的转换
- Wait
- Run
- Stop
- Finish
简单画了下 状态转移图
- 计时器的
暂停和恢复
,可以看作启动了一个新的计时器
,这时我们只需要将当前的时间保存进总记录时间,然后模仿启动和关闭计时器的过程就行。
二、代码
非完整项目代码
Clock.h
/** Copyright Moota, Private. All Rights Reserved. */
#pragma once
#include <ctime>
#include "../../Base/Object.h"
/**
* 计时器状态
*/
enum class EClockState:unsigned
{
/** 空状态,用于报错 */
None,
/** 等待状态,尚未计时 */
Wait,
/** 运行状态,启动计时 */
Run,
/** 结束状态,完成计时 */
Finish,
/** 暂停状态,停止计时 */
Stop
};
/**
* 计时器类
*/
class FClock : public UObject
{
private:
/** 状态 */
EClockState ClockState = EClockState::Wait;
/** 最初启动时间 */
clock_t InitTime = 0;
/** 当前启动时间 */
clock_t StartTime = 0;
/** 最后结束时间 */
clock_t EndTime = 0;
/** 总共记录时间 */
clock_t TotalTime = 0;
public:
/** 开始计时 */
void Start();
/** 暂停计时 */
void Pause();
/** 恢复计时 */
void Resume();
/** 结束计时 */
void End();
/** 重置计时 */
void Reset();
/** 显示计时
* @param IsShowStartAndEnd 是否显示最初启动和最后结束时间
*/
void Show(bool IsShowStartAndEnd = false) const;
};
Clock.cpp
#include "Clock.h"
#include "../Exception/Exception.h"
#include "../Log/Log.h"
void FClock::Start()
{
switch (ClockState)
{
case EClockState::None:
{
throw FException("请指定计时器的当前状态");
}
case EClockState::Wait:
{
InitTime = clock();
StartTime = InitTime;
ClockState = EClockState::Run;
break;
}
case EClockState::Run:
{
FLog::Println("计时器已处于运行状态", ELogType::Warning);
break;
}
case EClockState::Finish:
{
FLog::Println("计时器已处于结束状态", ELogType::Warning);
break;
}
case EClockState::Stop:
{
FLog::Println("计时器已处于暂停状态", ELogType::Warning);
break;
}
}
}
void FClock::Pause()
{
switch (ClockState)
{
case EClockState::None:
{
throw FException("请指定计时器的当前状态");
}
case EClockState::Wait:
{
FLog::Println("计时器已处于等待状态", ELogType::Warning);
break;
}
case EClockState::Run:
{
const clock_t PauseTime = clock();
ClockState = EClockState::Stop;
TotalTime += PauseTime - StartTime;
break;
}
case EClockState::Finish:
{
FLog::Println("计时器已处于结束状态", ELogType::Warning);
break;
}
case EClockState::Stop:
{
FLog::Println("计时器已处于暂停状态", ELogType::Warning);
break;
}
}
}
void FClock::Resume()
{
switch (ClockState)
{
case EClockState::None:
{
throw FException("请指定计时器的当前状态");
}
case EClockState::Wait:
{
FLog::Println("计时器已处于等待状态", ELogType::Warning);
break;
}
case EClockState::Run:
{
FLog::Println("计时器已处于运行状态", ELogType::Warning);
break;
}
case EClockState::Finish:
{
FLog::Println("计时器已处于结束状态", ELogType::Warning);
break;
}
case EClockState::Stop:
{
StartTime = clock();
ClockState = EClockState::Run;
break;
}
}
}
void FClock::End()
{
switch (ClockState)
{
case EClockState::None:
{
throw FException("请指定计时器的当前状态");
}
case EClockState::Wait:
{
FLog::Println("计时器已处于等待状态", ELogType::Warning);
break;
}
case EClockState::Run:
{
EndTime = clock();
TotalTime += EndTime - StartTime;
ClockState = EClockState::Finish;
break;
}
case EClockState::Finish:
{
FLog::Println("计时器已处于结束状态", ELogType::Warning);
break;
}
case EClockState::Stop:
{
ClockState = EClockState::Finish;
break;
}
}
}
void FClock::Reset()
{
switch (ClockState)
{
case EClockState::None:
{
throw FException("请指定计时器的当前状态");
}
case EClockState::Wait:
{
FLog::Println("计时器已处于等待状态", ELogType::Warning);
break;
}
case EClockState::Run:
{
TotalTime = 0;
ClockState = EClockState::Wait;
break;
}
case EClockState::Finish:
{
TotalTime = 0;
ClockState = EClockState::Wait;
break;
}
case EClockState::Stop:
{
TotalTime = 0;
ClockState = EClockState::Wait;
break;
}
}
}
void FClock::Show(bool IsShowStartAndEnd) const
{
if (IsShowStartAndEnd)
{
FLog::Println("计时器开始时间:" + FString(InitTime) + "ms");
FLog::Println("计时器结束时间:" + FString((EndTime == 0 ? "?" : FString(EndTime))) + "ms");
}
FLog::Println("计时器记录时间:" + FString(TotalTime) + "ms");
}