上文已经实现的定时器,但是在需要在主线程中可能无法满足需求https://blog.csdn.net/allen807733144/article/details/94014639
于是我们有了下面代码:
class Timer
{
public:
void run()
{
auto it = m_vecTimer.begin();
for (; it != m_vecTimer.end(); it++)
{
if (!std::get<3>(*it))
continue;
int en = clock() - std::get<2>(*it);
if (en >= std::get<0>(*it))
{
std::get<1>(*it)();
if (std::get<4>(*it))
{
std::get<2>(*it) = clock();
}
else
{
std::get<3>(*it) = false;
m_vecTimer.erase(it--);
}
}
}
}
/**
* @brief 设置定时器
* @param1: 时间(ms)
* @param2: 回调
* @param3: 循环(默认一次)
*/
void setTimer(int time, std::function<void()> fun, bool loop = false)
{
m_vecTimer.push_back(std::make_tuple(time, fun, (int)clock(), true, loop));
}
private:
/**
* @brief
* @param1 总时间(单位:ms)
* @param2 回调
* @param3 开始时时钟时间
* @param4 定时器开始/结束标志
* @param4 是否循环
*/
typedef std::vector<std::tuple<int, std::function<void()>, int, bool, bool>> TimerVec;
TimerVec m_vecTimer;
};
这里需注意,run需在主线程循环中每帧调用