源码下载 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)的更多相关文章

  1. .Net之时间轮算法(终极版)定时任务

    TimeWheelDemo 一个基于时间轮原理的定时器 对时间轮的理解 其实我是有一篇文章(.Net 之时间轮算法(终极版))针对时间轮的理论理解的,但是,我想,为啥我看完时间轮原理后,会采用这样的方 ...

  2. .Net 之时间轮算法(终极版)

    关于时间轮算法的起始 我也认真的看了时间轮算法相关,大致都是如下的一个图 个人认为的问题 大部分文章在解释这个为何用时间轮的时候都再说 假设我们现在有一个很大的数组,专门用于存放延时任务.它的精度达到 ...

  3. 时间轮算法(TimingWheel)是如何实现的?

    前言 我在2. SOFAJRaft源码分析-JRaft的定时任务调度器是怎么做的?这篇文章里已经讲解过时间轮算法在JRaft中是怎么应用的,但是我感觉我并没有讲解清楚这个东西,导致看了这篇文章依然和没 ...

  4. 时间轮算法在Netty和Kafka中的应用,为什么不用Timer、延时线程池?

    大家好,我是yes. 最近看 Kafka 看到了时间轮算法,记得以前看 Netty 也看到过这玩意,没太过关注.今天就来看看时间轮到底是什么东西. 为什么要用时间轮算法来实现延迟操作? 延时操作 Ja ...

  5. 延时任务-基于netty时间轮算法实现

    一.时间轮算法简介 为了大家能够理解下文中的代码,我们先来简单了解一下netty时间轮算法的核心原理 时间轮算法名副其实,时间轮就是一个环形的数据结构,类似于表盘,将时间轮分成多个bucket(比如: ...

  6. [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用

    [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 定 ...

  7. kafka时间轮的原理(一)

    概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...

  8. 记录——时间轮定时器(lua 实现)

    很长一段时间里,我错误的认识了定时器.无意中,我发现了“时间轮”这个名词,让我对定时器有了新的看法. 我错误的认为,定时器只需要一个 tick 队列,按指定的时间周期遍历队列,检查 tick 倒计时满 ...

  9. 经典多级时间轮定时器(C语言版)

    经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...

随机推荐

  1. intellijidea课程 intellijidea神器使用技巧2-2 精准搜索

    高效定位: 1 类: 类的跳转: Ctrl shift n ==> 查询类名 Ctrl shift n n ==> jar包中的类 2 文件: Ctrl shift shift n ==& ...

  2. BZOJ1563: [NOI2009]诗人小G(决策单调性 前缀和 dp)

    题意 题目链接 Sol 很显然的一个dp方程 \(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\) 其中\(sum_i = \sum_{j = 1}^i len ...

  3. 无法找到msvcp90.dll的一个碰巧解决办法

     作者:朱金灿 来源:http://blog.csdn.net/clever101 上周同事使用VS2008编译一个C++的控制台工程.工程在release模式下可以编译成功,但是运行总是出现无法 ...

  4. python数据类型和数据运算

    数字 整型 包括正整数和负整数,和数学的表示方法一样.如:1.100.8008.-12等. 浮点型 浮点数字也称为小数,如果按照科学计数法表示时,小数点的位置是可变的.如:1.23x109==12.3 ...

  5. Azure进阶攻略丨如何驾驭罢工的Linux虚机网卡?

    很多人的生活中,流传着一个屡试不爽,据说可以解决任何问题的百宝锦囊: 所以经常可以听到类似这样的对话: -我的电脑咋上不去网了? -重启一下电脑. -还是不行呢! -重启一下路由器. -怎么还不行-_ ...

  6. 开源时序服务器influxdb使用

    文档 https://influxdb.com/docs/v0.9/introduction/overview.html 配置文件 /etc/opt/influxdb/influxdb.conf re ...

  7. LDAP 在ubuntu14.04下的安装配置install and configure

    https://help.ubuntu.com/lts/serverguide/openldap-server.html if error occurs in reinstall, try this: ...

  8. leetcode: 复杂度

    1. single-number Given an array of integers, every element appears twice except for one. Find that s ...

  9. Javascript作业—封装type函数,返回较详细的数据类型

    Javascript作业—封装type函数,返回较详细的数据类型 思路: 1 取typeof的值,如果是数字.函数等非对象类型,直接取类型 2 如果是object类型,则调用Object.protot ...

  10. 一个TCP的问题,所谓TCP面向连接的虚电路到底是怎么实现的?

    http://www.cskaoyan.com/thread-23715-1-1.html 今天我又查阅了一些资料,发觉一个问题,TCP所谓的面向连接的特性以及建立虚电路,与网络层虚电路服务好像有着本 ...