当前位置: 首页 > news >正文

c++自定义定时器

我们公司最近被qt公司盯上说侵权,现在在去qt化,本博文的定时器可以代替QTimer。

#ifndef TIMEERCPP_H
#define TIMEERCPP_H#include <thread>
#include <atomic>class Timer
{
public:void setInterval(int interval);~Timer();void stop();void start();private:void run();std::atomic<bool> active{false};int interval{1000};std::thread workerThread;
};#endif#include "timercpp.h"
#include <iostream>
#include <thread>void Timer::setInterval(int interval)
{this->interval = interval;
}Timer::~Timer()
{if(active.load()){stop();}
}void Timer::stop()
{active = false;if(workerThread.joinable()){workerThread.join();}
}void Timer::start()
{if(active.load()){stop();}active = true;workerThread = std::thread(&Timer::run, this);
}void Timer::run()
{std::cout<<"run"<<std::endl;while(active.load()){std::this_thread::sleep_for(std::chrono::milliseconds(interval));if(!active.load())return;std::cout<<"xxx"<<std::endl;}
}

这个代码可用,不卡GUI,缺点是每创建一个对象就创建一个子线程。

下面这个代码则进行了优化,使用一个子线程统一处理:

#ifndef TIMEERCPP_H
#define TIMEERCPP_H#include <thread>
#include <atomic>
#include <list>
#include <mutex>
#include <chrono>class Timer
{
public:Timer();~Timer();void updateTime(long long currentTime_millisec);void setInterval(int newInterval);private:long long millisec_since_epoch_currentTime;int interval{1000};int GC{0};
};class TimerEventManager
{
public:static TimerEventManager* getInstance();~TimerEventManager();void addTimer(Timer * timer);void removeTimer(Timer * timer);void start();void stop();private:void run();std::list<Timer*> list;std::atomic<bool> active{false};std::thread workerThread;std::mutex mutex;
};#endifTimerEventManager *TimerEventManager::getInstance()
{static TimerEventManager manager;return &manager;
}TimerEventManager::~TimerEventManager()
{active = false;if(workerThread.joinable()){workerThread.join();}
}void TimerEventManager::addTimer(Timer *timer)
{std::lock_guard<std::mutex> lock(mutex);list.push_back(timer);
}void TimerEventManager::removeTimer(Timer *timer)
{std::lock_guard<std::mutex> lock(mutex);list.remove(timer);
}void TimerEventManager::start()
{active.store(true);workerThread = std::thread(&TimerEventManager::run,this);
}void TimerEventManager::stop()
{active.store(false);if (workerThread.joinable()){workerThread.join();}
}void TimerEventManager::run()
{while(active.load()){std::this_thread::sleep_for(std::chrono::milliseconds(50));if (!active.load())return;auto currentTime_millisec = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();std::lock_guard<std::mutex> lock(mutex);for (auto& timer : list){timer->updateTime(currentTime_millisec);}}
}Timer::Timer()
{//获取时间点相对于 epoch(通常是 1970 年 1 月 1 日 00:00:00 UTC)的持续时间的函数。millisec_since_epoch_currentTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();TimerEventManager::getInstance()->addTimer(this);
}Timer::~Timer()
{TimerEventManager::getInstance()->removeTimer(this);
}void Timer::updateTime(long long currentTime_millisec)
{int t = (currentTime_millisec - millisec_since_epoch_currentTime) / interval;if(t > GC){GC = t;std::cout<<"超时 interval = "<<interval<<std::endl;}
}void Timer::setInterval(int newInterval)
{interval = newInterval;
}

相关文章:

  • Flutter基础 -- Flutter容器布局
  • 【Redis】Hash介绍与应用详解
  • Huawei 大型 WLAN 组网 AC 间漫游
  • linux基础-数据库建库建表
  • SiC碳化硅陶瓷膜的热导性
  • Three.js动效(第11辑):大屏+3D+动效,三位一体,是绝配。
  • 为什么选择mobx
  • vue使用tailwindcss
  • Python | 刷题笔记
  • vue -ant -design 卡片是布局 实现动态计算 当前的 左右间距 实现居中
  • MySQL——覆盖索引
  • 面试经典题:创建三个线程,按顺序依次循环打印hello+i
  • 你觉得学历在贬值吗?
  • 关于ASPICE 4.0评估师资质更新的说明-亚远景科技
  • Java多线程核心工具类
  • angular组件开发
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • extract-text-webpack-plugin用法
  • js ES6 求数组的交集,并集,还有差集
  • PAT A1092
  • PHP CLI应用的调试原理
  • PHP面试之三:MySQL数据库
  • Puppeteer:浏览器控制器
  • Python3爬取英雄联盟英雄皮肤大图
  • React Transition Group -- Transition 组件
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • ViewService——一种保证客户端与服务端同步的方法
  • vue 配置sass、scss全局变量
  • vue-cli3搭建项目
  • 从0实现一个tiny react(三)生命周期
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 强力优化Rancher k8s中国区的使用体验
  • 深入 Nginx 之配置篇
  • 通信类
  • 网页视频流m3u8/ts视频下载
  • 我的zsh配置, 2019最新方案
  • 一份游戏开发学习路线
  • (a /b)*c的值
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (多级缓存)缓存同步
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Thymeleaf用法——Thymeleaf简介
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .bat文件调用java类的main方法
  • .naturalWidth 和naturalHeight属性,
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net对接阿里云CSB服务
  • @EnableConfigurationProperties注解使用
  • @Transactional 详解
  • [ C++ ] STL---string类的使用指南