Как создать событие таймера, которое запустит другой таймер для сохранения времени, прошедшего с момента, в переменной при повышении?

#c# #events #timer #event-handling

#c# #Мероприятия #таймер #обработка событий

Вопрос:

У меня есть классы Machine и Production . Machine класс имеет свойство, IsProducing которое указывает, выполняется ли на компьютере производство. Production класс EstimatedTime для вычисления оставшегося времени производства и TimePassedSince для вычисления времени, прошедшего с момента завершения производства.

После того, как все проверки вернут true, я запускаю производство, изменяю IsProducing = 1; и вычисляю расчетное время, которое я передаю в качестве интервала для таймера, который я создаю.

Я хочу иметь событие, которое будет вызвано, когда таймер тикает, после чего IsProducing = 0; регистрируется текущее время EndTime и запускается новый таймер для вычисления TimePassedSince .

У меня есть следующий код в Production.cs:

  public delegate void EstimatedTimePassedHandler(Production production, Machine machine);
 public event EstimatedTimePassedHandler ProductionStarted;
 public event EstimatedTimePassedHandler ProductionCompleted;
  

У меня есть следующий код в Form.cs:

 if (dh.StartProduction(serialNr, empName) != -1)
                            {
                                machine.IsProducing = 1;
                                Double secondsToGo = machine.CycleTime * production.NrOfLamallae;
                                TimeSpan time = TimeSpan.FromSeconds(secondsToGo);
                                DateTime dateTime = DateTime.Today.Add(time);
                                production.EstimatedTime = dateTime;
                                string displayTime = dateTime.ToString("hh:mm:ss");
                                tbResult.Text = $"The production is started and will be ready in {displayTime}.";
                                int milliseconds = (int)secondsToGo * 100;
                                Timer timer1 = new Timer { Interval = milliseconds };
                                timer1.Enabled = true;
                                timer1.Tick  = new Production.EstimatedTimePassedHandler(this.EstimatedTimerTicked);
                            }
private void EstimatedTimerTicked(Production p, Machine m)
        {
            m.IsProducing = 0; //completed production, not producing anymore
            Timer timer1 = new Timer();    
            /* here I assign the production.EndTime and production.TimePassedSince */
        }
  

Это выдает мне следующую ошибку:

Невозможно неявно преобразовать тип ‘GUI_Designs .Производство.Оцененный timepassedhandler’ to ‘System.Обработчик событий ‘

Как я могу решить эту проблему? И какова наилучшая практика для обработки такого события с помощью таймера? И как сохранить время, прошедшее с тех пор, внутри переменной? Заранее большое спасибо!

Комментарии:

1. Хорошо, если речь идет только об обработчике: вы используете неправильную подпись для делегата обработчика. Это должно быть: void EventHandler(object? sender, EventArgs e); , так что в этом случае void EstimatedTimerTicked(object? sender, EventArgs e) это не принесет вам большой пользы.

2. Но мне интересно: что, если ваша оценка неверна или неточна? Реальность и программное обеспечение будут довольно быстро меняться. Вскоре работающие машины будут отображаться как «готово» и наоборот…

3. @Fildor Я использовал эту подпись, но изменил ее на текущую, потому что мне нужно иметь возможность управлять процессом производства и временем окончания производства, а также запускать второй таймер для сохранения времени, прошедшего с тех пор. Как это возможно с этой подписью?

4. Это не так. С System.Windows.Forms.Timer.Tick Event это то, что вы получаете: sender и EventArgs .