Автоматический запуск стратегии по указанному времени

Автоматический запуск стратегии по указанному времени
Atom
11/28/2013
IvanB


Может появиться необходимость автоматического запуска стратегии в указанное время в течении дня, поэтому здесь мы рассмотрим самый простой способ реализации автозапуска стратегии по времени.


Ключевым элементом будет таймер, который будут периодически сверять текущее время и выбранное время старта стратегии, объявляем переменную таймера в классе окна:
Code

    public partial class MainWindow : Window
    {
        private System.Threading.Timer _timer;
        ...


Объявим переменную типа DateTime, которая будет хранить время, когда нужно запустить стратегию, объявляем на том же уровне что и таймер:
Code

    public partial class MainWindow : Window
    {
        private System.Threading.Timer _timer;
        private DateTime _dtSelected;
        ...


И для удобства создадим на форме (окне) элемент выбора времени:
Code

<xctk:TimePicker Height="20" Width="100" x:Name="tpTime" />

в данном случае взят TimePicker из Xceed.Wpf.Toolkit:
Code
xmlns:xctk="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"

заметим, что этот контрол имеет имя tpTime, далее мы будем обращаться к нему по этому имени.

Теперь нам надо создать экземпляр этого таймера, указать ему метод, который будет периодически вызываться, и запустить таймер, для этого создадим кнопку, и укажем действие по нажатию:
Code

        private void AutoStartStrategyClick(object sender, RoutedEventArgs e)
        {
            if (tpTime.Value == null)
            {
                MessageBox.Show("Время запуска стратегии не выбрано");
                return;
            }

            _dtSelected = tpTime.Value.Value;

            _timer = new Timer(CheckStatus, null, 0, 1000);
            
        }


И реализуем метод CheckStatus:
Code

        public void CheckStatus(Object stateInfo)
        {
            var dtNow = DateTime.Now;
            if (_dtSelected.TimeOfDay < dtNow.TimeOfDay)
            {
                _firstStrategy.Start();
            }
        }


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

Есть специальные библиотеки, которые предоставляют большие возможности по работе с расписанием, например Quartz. Quartz позволяет создавать разного рода расписания, достаточно удобно и просто, если разобраться в его работе.


shos

Avatar
Date: 11/30/2013
Reply


Спасибо, Иван!
Полезная вещь.

Правильно ли я понимаю, что теперь, чтобы остановить стратегию по расписанию, нужно в метод

public void CheckStatus(Object stateInfo)
{
var dtNow = DateTime.Now;
if (_dtSelected.TimeOfDay < dtNow.TimeOfDay)
{
_firstStrategy.Start();
}}


прописать условие уже для _firstStrategy.Stop(); ?
Можно же использовать этот же таймер?

И еще, собственно, главный вопрос: если возникнет необходимость, при работе приложения, в автоматическом
включении и выключении стратегии более одного раза (без моего участия), допустим чтобы она часик покурила, а потом снова включилась,
то можно ли просто внести расписание в код?
Правильно ли будет создать несколько констант вместо _dtSelected, запустить таймер
(пусть даже без использования кнопок) и расставить условия на включение и выключение?
У меня пока нет тямы, чтобы разбираться с Quartz, поэтому сейчас чем проще, тем для меня понятнее.
Я пока еще в одной переменной путаюсь, а библиотеки для меня пока что где-то в 4-м измерении [biggrin]
Thanks:

IvanB

Avatar
Date: 12/1/2013
Reply


shos
Спасибо, Иван!
Полезная вещь.

Правильно ли я понимаю, что теперь, чтобы остановить стратегию по расписанию, нужно в метод

public void CheckStatus(Object stateInfo)
{
var dtNow = DateTime.Now;
if (_dtSelected.TimeOfDay < dtNow.TimeOfDay)
{
_firstStrategy.Start();
}}


прописать условие уже для _firstStrategy.Stop(); ?
Можно же использовать этот же таймер?

Да, все верно.

shos

И еще, собственно, главный вопрос: если возникнет необходимость, при работе приложения, в автоматическом
включении и выключении стратегии более одного раза (без моего участия), допустим чтобы она часик покурила, а потом снова включилась,
то можно ли просто внести расписание в код?
Правильно ли будет создать несколько констант вместо _dtSelected, запустить таймер
(пусть даже без использования кнопок) и расставить условия на включение и выключение?
У меня пока нет тямы, чтобы разбираться с Quartz, поэтому сейчас чем проще, тем для меня понятнее.
Я пока еще в одной переменной путаюсь, а библиотеки для меня пока что где-то в 4-м измерении [biggrin]

Да, верно понимаете. Создаете несколько переменных по подобию _dtSelected, например: _dtStartFirstSelected, _dtStopFirstSelected, _dtStartSecondSelected, _dtStopSecondSelected (в данном случае, судя по именам переменных, предполагается два рабочих интревала стратегии в течении дня), и соответственно задать условия и действия в методе CheckStatus.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy