2015-11-03 1 views
0

Пожалуйста, рассмотрите ниже тестовую программу. У меня есть три задания с определенным интервалом. [task1-- task1Interval, [task2-- task2Interval, [task3-- task3Interval] Я хочу использовать один таймер для выполнения всех трех задач. Все отлично работает, когда интервал находится в целочисленном размере. , мы хотим достичь той же функциональности с двойными значениями интервала, например [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"); 

    } 
} 
+0

Так что это ваша проблема? – Alexander

ответ

0

Это очень распространено к тому, что вы увидите в примитивном игровом движке. Вам нужны мировые «часы» с некоторым уровнем детализации, и вы обрабатываете каждое событие в каждом «тике».

Вы уже знаете, что ваша гранулярность должна быть наименьшим общим знаменателем среди ваших интервалов (в данном случае 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 
} 
+0

Спасибо тонну за ваши ценные материалы. – Ipsa

+0

Надеюсь, это полезно. Пожалуйста, отметьте его как правильный ответ, если он вам подходит. – Ternary

Смежные вопросы