南昌网站建设招聘,营销方式有哪几种,阿里云做网站步骤,公司做网站设计要注意时隔多日#xff0c;好不容易挤出点时间来写写博文。不容易#xff0c;请送我几朵红花#xff0c;点个赞也行。 今天呢#xff0c;我们主要来扩展下通用工具类定时触发器。 顾名思义#xff0c;所谓的定时触发器#xff0c;就是告诉程序在过多长时间后#xff0c;我…时隔多日好不容易挤出点时间来写写博文。不容易请送我几朵红花点个赞也行。 今天呢我们主要来扩展下通用工具类定时触发器。 顾名思义所谓的定时触发器就是告诉程序在过多长时间后我要执行某个特定的任务。 比如举个小栗子 电饭煲相信大家都用过当我们出去工作或者上学的时候我们只要设置下煮饭时间就可以安心的离开。 电饭煲会自动的开始计时工作等到了你设置的时间后他就会自动的开始煮饭啊什么的。而你却可以在远在千里的上班。 智能化对就是这样的效果。我们今天就来写写这个智能的小东西。 首先在设计这个小功能之前我们要明白自己需要的是什么如何设计 1.需要什么 1肯定要有个管理定时器的类命名TimeTaskManager。上网查了下定时器英文可以为:TimeTask所以就取了这个名字 2既然有了这个管理类那么这个管理类要管理什么东西对喽是你所要定时执行的任务。那么这个任务要包含什么东西 1.多久时间开始执行任务肯定要 2.重复执行间隔有些任务要定时的重复执行比如像机器加工厂的机器昼夜重复一个加工动作 ok我们命名为TimeTask 2.如何设计 当我们设计一个个有相关联的类的时候我们可能需要纸笔来打草稿其实完全不用学过uml的同学可以新手拈来。这里呢我推荐使用Process On这个工具。在线绘画工具非常好用。 这里我们边设计边画图 首先从TimeTask下手对于这个类我们要想作为一个任务而且还是定时的。那么一下就能想到任务执行用委托。还有程序肯定有许多任务所以要定义一个id识别这个唯一任务。 那么定时肯定也需要一些变量 1.private uint id;//任务id 2.private uint interval;//间隔多少秒重复这个任务 3.private Action action;//无参委托 看到这里这个Timetask任务类大致建立好了。 哎细心的同学可能会发现这个Action委托是个无参委托那么假如说我的任务方法有带参的怎么办呢?哎那么问题就来了。 那么我再设计一个带一个参数的TimetaskT类,然后ActionT action不就行了。那二个参数呢三个参数呢...... 有多少个参数你都要设计多少个类。 所以对于这样的情况我们需要把Timetask抽象成一个基类命名为AbstractTimeTask 哎只要我们所有无参带参的TimeTask都继承与AbstractTimeTask抽象类这样代码的复用性就大大提高了。 设计好了之后我们编写代码 AbstractTimeTask using UnityEngine;
using System.Collections;
using System;
#region 模块信息
/*----------------------------------------------------------------
// 模块名AbstractTimeT
// 创建者chen
// 修改者列表
// 创建日期2015.11.5
// 模块描述//----------------------------------------------------------------*/
#endregion
public abstract class AbstractTimeTask
{#region 字段private uint m_uiTimeId;//任务idprivate int m_iInterval;//任务重复时间间隔,为0不重复private ulong m_ulNextTick;//下一次触发的时间点#endregion#region 属性public uint TimeId{get {return m_uiTimeId;}set {m_uiTimeId value;}}public int Interval {get { return m_iInterval; }set { m_iInterval value; }}public ulong NextTick {get{return m_ulNextTick;}set {this.m_ulNextTick value;}}/// summary/// 抽象属性给子类自定义自己的action委托/// /summarypublic abstract Action Action{get;set;}#endregion#region 公有方法/// summary/// 抽象方法给自己自己定义执行委托/// /summarypublic abstract void DoAction();#endregion
}TimeTask:这里主要先讲无参 using UnityEngine;
using System.Collections;
using System;
#region 模块信息
/*----------------------------------------------------------------
// 模块名TimeTask
// 创建者chen
// 修改者列表
// 创建日期2015.11.5
// 模块描述定时触发任务类
//----------------------------------------------------------------*/
#endregion
public class TimeTask : AbstractTimeTask
{#region 字段private Action m_action;//定义自己的委托#endregion#region 属性public override Action Action{get{return m_action;}set{m_action value;}}#endregion#region 公有方法/// summary/// 重新父类的委托方法/// /summarypublic override void DoAction(){m_action();}#endregion
}这里我们增加了NextTick字段有什么卵用呢?主要是用来与当前程序运行时间比较如果刚好等于这个NextTick值时就触发委托函数执行任务。 细想一下我们定时管理器类要把任务一个个加到队列里面管理那么肯定需要一个时间变量与task里面的时间变量进行比较。 所以定时管理类就需要一个static uint tick变量来记录程序运行总的时间如果吧task加到队列里面task的NextTick程序运行的总的时间tickstart(多久之后执行任务);还有就是如果task的interval的值大于0也就是说有重复的执行那么就需要再加上interval的值然后再加入到队列里面。 分析了这么多接着来写管理类 TimeTaskManager using UnityEngine;
using System.Collections.Generic;
using System.Diagnostics;
using System;
#region 模块信息
/*----------------------------------------------------------------
// 模块名TimeTaskManager
// 创建者chen
// 修改者列表
// 创建日期2015.11.5
// 模块描述定时触发器管理类
//----------------------------------------------------------------*/
#endregion
public class TimeTaskManager
{#region 字段private static uint m_uiNextTimeId;//总的id需要分配给task也就是每加如一个task就自增private static uint m_uiTick;//总的时间用来和task里面的nexttick变量来进行比较看是否要触发任务private static QueueAbstractTimeTask m_queue;private static Stopwatch m_stopWatch;//c#自带的计时器不会的自行百度private static readonly object m_queueLock new object();//队列锁#endregion#region 构造方法private TimeTaskManager(){}static TimeTaskManager(){m_queue new QueueAbstractTimeTask();m_stopWatch new Stopwatch();}#endregion#region 公有方法/// summary/// 吧Task加入到队列里面来管理既然是个管理器肯定要有个添加task的操作/// /summary/// param namestart多久之后开始执行ms/param/// param nameinterval重复时间间隔ms/param/// param nameaction任务委托/param/// returns任务id/returnspublic static uint AddTimer(uint start, int interval, Action action){AbstractTimeTask task GetTimeTask(new TimeTask(), start, interval, action);lock (m_queueLock){m_queue.Enqueue(task);}return task.TimeId;}/// summary/// 周期性执行/// /summarypublic static void Tick(){TimeTaskManager.m_uiTick (uint)(m_stopWatch.ElapsedMilliseconds);//nityEngine.Debug.Log(TimeTaskManager.m_uiTick);m_stopWatch.Reset();m_stopWatch.Start();while (m_queue.Count ! 0){AbstractTimeTask task;lock (m_queueLock){task m_queue.Peek();//这里注意队列并没有删除元素只是放回元素元素还在队列里面}if (TimeTaskManager.m_uiTick task.NextTick)//如果程序的总时间小于task要执行的时间点就break点继续等待{break;}lock (m_queueLock){m_queue.Dequeue();}if (task.Interval 0)//如果需要重复的话{task.NextTick (ulong)task.Interval;lock (m_queueLock){m_queue.Enqueue(task);//再次加入队列里面注意哦id不变的}task.DoAction();}else {task.DoAction();//执行委托}}}#endregion#region 私有方法private static AbstractTimeTask GetTimeTask(AbstractTimeTask task,uint start,int interval,Action action) {task.Interval interval;task.TimeId TimeTaskManager.m_uiNextTimeId;task.NextTick TimeTaskManager.m_uiTick start;task.Action action;return task;}#endregion
}注意AddTimer的参数的单位是毫秒不是秒。 接下来是实验 首先写个Driver作为驱动类。 using UnityEngine;
using System.Collections;
#region 模块信息
/*----------------------------------------------------------------
// 模块名Driver
// 创建者chen
// 修改者列表
// 创建日期2015.11.5
// 模块描述驱动类
//----------------------------------------------------------------*/
#endregion
public class Driver : MonoBehaviour
{void Start(){TimeTaskManager.AddTimer(5000, 5000, DebugTest);InvokeRepeating(Tick, 0, 0.02f);}void Update(){}void Tick(){TimeTaskManager.Tick();}void DebugTest(){Debug.Log(111);}
}创建一个空物体然后赋予它这个脚本作为驱动所有程序脚本。 运行发现程序在5秒之后每隔5秒打印一个111到控制台。 这个定时类非常的有用就比如说网络通信啊我们可以定时的发送心跳包还有弹出警告窗口计时多少秒之后自动关闭等等 转载于:https://www.cnblogs.com/CaomaoUnity3d/p/4940655.html