服务器设计笔记(2)-----定时器的实现(C++)
2023-09-14 08:57:59 时间
很久之前听著名页游服务器主程讲座时,讲到过定时器的实现,基本思路如下(易语言)
while(true)
{
对定时器进行排序。
for(遍历定时器)
{
if 如果定时器到:
callback;
else
break;
}
usleep(20);
}
按照这个思路,我们继续我们的设计:
1: 首先 定义一个Thread类:
/* * Thread.h * Created on: Sep 11, 2012 * Author: root #ifndef THREAD_H_ #define THREAD_H_ #include pthread.h class Thread { public: enum THREADSTATE IDLE, WORK, BUSY, public: Thread(); virtual ~Thread(); virtual void* run(void) = 0; virtual int start(void); virtual int cancel(void); pthread_t get_pid() const return pid; protected: THREADSTATE _thread_state; private: pthread_t pid; static void* thread_entry(void* para); #endif /* THREAD_H_ */实现代码Thread.cpp:
/* * Thread.cpp * Created on: Sep 11, 2012 * Author: root #include "Thread.h" Thread::Thread() { // TODO Auto-generated constructor stub Thread::~Thread() { // TODO Auto-generated destructor stub void* Thread::thread_entry(void* para) Thread *pThread = static_cast Thread * (para); return pThread- run(); int Thread::start(void) if(pthread_create( pid,0,thread_entry,static_cast void * (this)) 0) pthread_detach(this- pid); return -1; return 0; int Thread::cancel(void) pthread_cancel(this- pid); return 0; }
2:定义定时器,和定时器线程:
TimerThread.h
/* * Timer.h * Created on: Sep 11, 2012 * Author: root #ifndef TIMER_H_ #define TIMER_H_ #include "Thread.h" #include list using namespace std; struct Timer void *_args; int (*_callback)(); int _interval; int leftsecs; void open(int interval,int (*callback)()) _interval = interval * 1000; leftsecs = _interval; _callback = callback; bool operator (Timer _timer) return _timer.leftsecs this- leftsecs; bool operator == (Timer _timer) return _timer.leftsecs == this- leftsecs; class TimerThread : public Thread public: static TimerThread* _instance; static TimerThread* get_instance(); virtual void* run(void); virtual ~TimerThread(); void Register(Timer _timer); void unRegister(Timer _timer); private: TimerThread(); list Timer _timer_list; extern unsigned int get_systime_clock();
3: 测试函数:
//============================================================================ // Name : test.cpp // Author : archy // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include iostream #include string #include stdio.h #include sys/types.h #include "Timer.h"
}目前存在的问题:定时不准,主要是由于usleep()之后 ,不能及时醒,这个是因为Linux线程调度引起的。
改进的方向:1. TimerThread 里面的list换成优先队列
2. 添加时间纠正,在测试中发现,每次大概慢100us左右,这对于长时间的定时器是致命。
也想听听广大网友的意见,感激不尽。
西门子S7-1200编程实例,关断延迟定时器指令如何使用? 在西门子S7-1200中有四种类型的定时器:TON接通延迟定时器、TONR保持型接通延迟定时器、TOF关断延迟定时器、TP脉冲定时器。
【嵌入式】窗户看门狗定时器概念详解+例题解析 嵌入式系统使用WWDG窗口看门狗模块监视用户程序运行,假设看门狗的喂狗时间为20ms,PCLK1频率为36MHz,WDGTB[1:0]=10b。请计算看门狗的定时计数值(给出计算过程),并写出看门狗的初始化函数(注:使用寄存器方式程序)
ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器) 到了测试第6课,还没有玩过ESP32-C3的基本定时器,虽然FreeRTOS,可以使用软件定时器 但是软件定时器毕竟也有不适用的时候,这个在我FreeRTOS博文中有单独说明。 所以硬件定时器也得熟悉,同时附带简单用一下软件定时器。