时间轮算法的定时器(Delphi)
源码下载 http://files.cnblogs.com/lwm8246/uTimeWheel.rar
D7,XE2 编译测试OK
//时间轮算法的定时器
//-- : QQ unit uTimeWheel; interface uses
Windows,Classes,SysUtils,SyncObjs; type
PTWItem=^TTWItem;
TTWItem=record
UserData:Pointer; //用户数据
Tag:Integer; //用户数据
Positin:Integer;
Interval:Integer;//定时时间(ms)
end; TTimeWheel=class(TThread)
private
FCS:TCriticalSection;
FInterval:Integer;
FWorkDone:Boolean;
function getPosition: Integer;
protected
FPosition:Integer;
FSize:DWORD;
FList:TList;
procedure Execute();override;
procedure OnTime(PI:PTWItem);virtual;abstract;
public
//AOnTimeCount 最大触发次数
constructor Create(AOnTimeCount:DWORD;AInterval:Integer);virtual;
destructor Destroy();override;
procedure Lock();
procedure UnLock();
procedure Start();
procedure Stop();
//\\
function RegisterTime(AInterval:Integer):PTWItem;virtual;
public
property List:TList read FList;
property Position:Integer read getPosition;
property Interval:Integer read FInterval; //单位 ms
property WorkDone:Boolean read FWorkDone;
end; implementation { TTimeWheel } constructor TTimeWheel.Create(AOnTimeCount:DWORD;AInterval:Integer);
var
Index:DWORD;
PI:PTWItem;
begin
inherited Create(TRUE);
FCS := TCriticalSection.Create();
FLIst := TList.Create();
FList.Capacity := AOnTimeCount;
FSize := AOnTimeCount;
FInterval := AInterval;
for Index := to FSize - do
begin
New(PI);
PI^.UserData := nil;
PI^.Interval := ;
FList.Add(PI);
end;
FPosition := ;
FreeOnTerminate := FALSE;
FWorkDone := FALSE;
end; destructor TTimeWheel.Destroy;
var
Index:integer;
PI:PTWItem;
begin
FCS.Free();
for Index := to FList.Count - do
begin
PI := PTWItem(FList.Items[Index]);
if PI <> nil then Dispose(PI);
end;
FList.Free();
inherited;
end; procedure TTimeWheel.Execute;
procedure Delay(Value:Integer);
begin
while((not Terminated) and (Value > )) do
begin
Dec(Value,);
Sleep();
end;
end;
var
PI:PTWItem;
begin
while(not Terminated) do
begin
//Sleep(FInterval);
Delay(FInterval);
Lock();
try
Inc(FPosition);
FPosition := FPosition mod FSize;
PI := FList.Items[FPosition];
PI^.Positin := FPosition;
finally
UnLock();
end;
//触发时间到事件
if not Terminated then
begin
OnTime(PI);
end;
end;
FWorkDone := TRUE;
end; function TTimeWheel.getPosition: Integer;
begin
FCS.Enter();
Result := FPosition;
FCS.Leave();
end; procedure TTimeWheel.Lock;
begin
FCS.Enter();
end; function TTimeWheel.RegisterTime(AInterval: Integer): PTWItem;
var
Lfactor:Integer;
LPosition:Integer;
begin
if AInterVal > FInterval * FSize then
raise exception.CreateFmt('TTimeWheel.RegisterTime(%d),Out of Time Range',[AInterval]);
Lfactor := AInterval div FInterval;
LPosition := Position + Lfactor;
LPosition := LPosition mod FSize;
Result := FList.Items[LPosition];
Result^.Interval := AInterval;
Result^.Positin := LPosition;
end; procedure TTimeWheel.Start();
begin
Resume();
end; procedure TTimeWheel.Stop;
begin
Terminate();
while(TRUE) do
begin
if FWorkDone then Break;
Sleep();
end;
end; procedure TTimeWheel.UnLock;
begin
FCS.Leave();
end; end.
时间轮算法的定时器(Delphi)的更多相关文章
- .Net之时间轮算法(终极版)定时任务
TimeWheelDemo 一个基于时间轮原理的定时器 对时间轮的理解 其实我是有一篇文章(.Net 之时间轮算法(终极版))针对时间轮的理论理解的,但是,我想,为啥我看完时间轮原理后,会采用这样的方 ...
- .Net 之时间轮算法(终极版)
关于时间轮算法的起始 我也认真的看了时间轮算法相关,大致都是如下的一个图 个人认为的问题 大部分文章在解释这个为何用时间轮的时候都再说 假设我们现在有一个很大的数组,专门用于存放延时任务.它的精度达到 ...
- 时间轮算法(TimingWheel)是如何实现的?
前言 我在2. SOFAJRaft源码分析-JRaft的定时任务调度器是怎么做的?这篇文章里已经讲解过时间轮算法在JRaft中是怎么应用的,但是我感觉我并没有讲解清楚这个东西,导致看了这篇文章依然和没 ...
- 时间轮算法在Netty和Kafka中的应用,为什么不用Timer、延时线程池?
大家好,我是yes. 最近看 Kafka 看到了时间轮算法,记得以前看 Netty 也看到过这玩意,没太过关注.今天就来看看时间轮到底是什么东西. 为什么要用时间轮算法来实现延迟操作? 延时操作 Ja ...
- 延时任务-基于netty时间轮算法实现
一.时间轮算法简介 为了大家能够理解下文中的代码,我们先来简单了解一下netty时间轮算法的核心原理 时间轮算法名副其实,时间轮就是一个环形的数据结构,类似于表盘,将时间轮分成多个bucket(比如: ...
- [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用
[从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 定 ...
- kafka时间轮的原理(一)
概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...
- 记录——时间轮定时器(lua 实现)
很长一段时间里,我错误的认识了定时器.无意中,我发现了“时间轮”这个名词,让我对定时器有了新的看法. 我错误的认为,定时器只需要一个 tick 队列,按指定的时间周期遍历队列,检查 tick 倒计时满 ...
- 经典多级时间轮定时器(C语言版)
经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...
随机推荐
- 定时备份oracle数据库脚本文件
@echo off REM ########################################################### REM # Windows Server 2003下 ...
- java并发编程 volatile关键字 精准理解
1.volatile的作用 一个线程共享变量(类的成员变量.类的静态成员变量等)被volatile修饰之后,就具有以下作用: 1)并发中的变量可见性(不同线程对该变量进行操作时的可见性),即一个线程修 ...
- BZOJ3261: 最大异或和(可持久化trie树)
题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...
- 进一步了解this和super
知乎上看到一问题很好,拿了与大家分享,原地址:https://www.zhihu.com/question/31548104. 问: JAVA 中this 和super与覆写冲突的问题? 实例一: 输 ...
- Python基础学习之文件(1)
1.文件对象 文件对象不仅可以用来访问普通的磁盘文件,还可以访问具有文件类型接口的其他对象;文件只是连续的字节序列. 2.文件内建函数(open()) 内建函数open()是打开文件的"钥匙 ...
- 如何利用PHP语言压缩图片?PHP入门教程
PHP可以控制缩略图清晰度和缩略图之后产生音量的产生.下面我们就来看看如何使用PHP优化我们的压缩图像. PHP应用程序的开发往往涉及生成缩略图,使用PHP生成缩略图的过程本身并不难,但你知道PHP ...
- 梦织未来Windows驱动编程 第03课 驱动的编程规范
最近根据梦织未来论坛的驱动教程学习了一下Windows下的驱动编程,做个笔记备忘.这是第03课<驱动的编程规范>. 驱动部分包括基本的驱动卸载函数.驱动打开关闭读取写入操作最简单的分发例程 ...
- 如何处理Eclipse错误消息 The declared package does not match the expected package
我从github下载了一个开源项目后,导入到自己Eclipse之后,遇到了这个烦人的错误消息: The declared package "com.sap.smartService" ...
- 使用Excel调用ABAP系统的函数
效果:在excel里创建一个按钮,开发一些VB script,可以连接指定的ABAP系统并执行系统里的ABAP function module. 在这里例子里执行ABAP系统的函数TH_USER_LI ...
- IOS transform的使用(移动,放大,旋转)
@interface ViewController () - (IBAction)up; - (IBAction)big ; - (IBAction)leftRotate ; @property (n ...