对于不同的双间隔值使用相同计时器的多个任务

时间:2015-11-03 17:25:17

标签: c#

请考虑以下测试程序。 我有三个特定间隔的任务。 [task1-- task1Interval,[task2-- task2Interval,[task3-- task3Interval] 我想使用单个计时器来执行所有三个任务。 当interval为整数时,每件事都可以正常工作。 我们希望用双间隔值实现相同的功能,例如[task1Interval-- 0.1,[task2Interval-- 2.1,[task3Interval-- 3.1]。

任何针对相同的指针都将受到高度赞赏。

public class Class1
{
    private System.Timers.Timer _timer;
    private int _counter=0;
    private int task1Interval = 1;
    private int task2Interval = 2;
    private int task3Interval = 3;

    public void Start()
    {
        this._timer = new System.Timers.Timer(100);
        this._timer.AutoReset = true;
        this._timer.Elapsed += new System.Timers.ElapsedEventHandler(this.serviceTimerElapse);
        this._timer.Enabled = true;
        this._timer.Start();
    }

    private void serviceTimerElapse(object source, System.Timers.ElapsedEventArgs e)
    {
        this._counter++;
        if (this._counter % task1Interval == 0)
        {
            task1();    
        }
        if (this._counter % task2Interval == 0)
        {
            task2();
        }
        if (this._counter % task3Interval == 0)
        {
            task3();
        }
    }
    private void task1()
    {
        Console.WriteLine("task1 started");

    }
    private void task2()
    {
        Console.WriteLine("task2 started");

    }
    private void task3()
    {
        Console.WriteLine("task3 started");

    }
}

1 个答案:

答案 0 :(得分:0)

这与您在原始游戏引擎中看到的非常相似。你需要一个具有某种粒度级别的世界“时钟”,你可以处理每个“tick”中的每个事件。

您已经知道您的粒度需要是您的间隔中最小的分母(在这种情况下为0.1)。然后,原始解决方案将包括每个任务的计数器以及阈值。

Ex(伪代码):

private const double TICK = 0.1;
private double TASK_1_THRESHOLD = 0.1;
private double TASK_1_COUNT = 0.0;
private double TASK_2_THRESHOLD = 2.1;
private double TASK_2_COUNT = 0.0;
private double TASK_3_THRESHOLD = 3.1;
private double TASK_3_COUNT = 0.0;

    private void tick()
{
   TASK_1_COUNT += TICK;
   TASK_2_COUNT += TICK;
   TASK_3_COUNT += TICK;

   if (TASK_1_COUNT >= TASK_1_THRESHOLD) {
       TASK_1_COUNT = 0.0;     
       task1();
     }
    // do this for each
}