Posts Tagged ‘定时器’
C++ for Arduino EventTimer(事件定时器)循环队列
星期六, 四月 20th, 2013 579 views我们知道在Arduino中是没有线程这个概念的,如果需要同时按照时间间隔执行多个事件,使用系统自带的delay()进行阻塞势必会影响到后面的事件。例如在loop()中我们需要不间断的向电机发送脉冲信号使之行走,同时每间隔1s向控制端发送一次数据。如果采用delay(1000)的方法,电机则会每隔1s才获得一次脉冲信号,这不是我们想要的。所以,我们需要为此自定义一个事件定时器。
事件定时器类的C++代码如下:
EventTimer.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #pragma once #include "Arduino.h" typedef void (*LPFUNC)();//typedef定义一个函数指针 class EventTimer { public: EventTimer(void); ~EventTimer(void); void Init();//初始化 void Looper();//事件循环 void AddEvent(LPFUNC fun,int delay,int repeat);//添加一个事件 private: /*事件结构体*/ struct EventNode{ LPFUNC fun;//事件函数体 int delay;//执行延时 int repeat;//执行次数 int lasttime;//上一个时间 EventNode * next,* prior;//上一级、下一级指针 }; EventNode *head; EventNode *tail; }; |
Unity3D协程闭包事件执行定时器
星期一, 三月 11th, 2013 554 views介于U3D没有一个自带的事件执行定时器,所以打算自己动手做一个,基本思路如下,先用伪代码来写了
1 2 3 4 5 6 | void timer(int time,Func func){ wait(time);//等待N秒 func();//执行传入的函数 } |
最开始的思路是用闭包加线程来实现,之后和群里的朋友讨论了下,经过提示其实可以避免去碰线程这种bug多发产物,取而代之的是U3D包里自带的一个协程MonoBehaviour.StartCoroutine
先来完善下我们的事件定时器,惯例直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using UnityEngine; using System.Collections; using System; public class EventTimer : MonoBehaviour { public IEnumerator Timer(float waitTime , Func[bool> func) { yield return new WaitForSeconds(waitTime); func(); } } |