Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
4 / 4 / 0
Регистрация: 14.03.2013
Сообщений: 29

Выполнение метода в определенное время суток

10.01.2014, 11:08. Показов 5333. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно по сабжу, вчера озадачился отправкой отчетов с сервера в определенное время суток (один раз или более).
Так как отчетов много и время и интервалы отправки могут быть разные, то настройка таймеров в ручную для каждого отчета, неприемлима.

В инетах ничего универсального не нашел, пришлось писать.

Выкладываю, если для кого актуально, пользуйтесь.
Просто передаете в метод время суток когда нужно вызвать метод в формате "HH:mm;HH:mm;HH:mm", ну и собственно сам таймер.
Код может и не самый красивый, но работает, и ресурсов почти не жрет (сравнивая с решениями проверять раз в секунду то или не то время, или с циклами while(true){}).
Просто запускаете mooving_report(), таймер перенастраивается на ближайший интервал времени и далее уже работает по заданным интервалам.

C#
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
    class Procedures
    {
        private static System.Timers.Timer aTimer_sendrepmoov;
 
        public static void mooving_report()
        {
            aTimer_sendrepmoov = new System.Timers.Timer();
            aTimer_sendrepmoov.Elapsed += new ElapsedEventHandler(OnTimedEvent_sendrep_moov);
            aTimer_sendrepmoov.Interval = 20;
            aTimer_sendrepmoov.Enabled = true;
        }
 
        private static void OnTimedEvent_sendrep_moov(object source, ElapsedEventArgs e)
        {
            if (setting_timer(aTimer_sendrepmoov, "09:30;12:00;20:30;01:40"))
            {
  ВашМетод();
            }
        }
 
        private static bool setting_timer(System.Timers.Timer timer, string timeload)
        {
            bool test = false;
            string[] arrtime = timeload.Split(char.Parse(";"));
            List<INTERVALS> interv = new List<INTERVALS>();
            int _ind = 0;
            if (arrtime.Length != 1)
            {
                foreach (string h in arrtime)
                {
                    string[] tm = h.Split(char.Parse(":"));
                    int hourse = Convert.ToInt32(tm[0]);
                    int minutes = Convert.ToInt32(tm[1]);
                    INTERVALS _i = new INTERVALS();
                    _i.hourse = hourse;
                    _i.minutes = minutes;
                    if (_ind != 0)
                    {
                        if (interv[_ind - 1].total < _i.total)
                        {
                            interv[_ind - 1].interval = (_i.total - interv[_ind - 1].total) * 3600000;
                        }
                    }
                    _ind++;
                    interv.Add(_i);
                }
                interv[_ind - 1].interval = (interv[0].total + (24 - interv[_ind - 1].total)) * 3600000;
            }
            else
            {
                string[] tm = arrtime[0].Split(char.Parse(":"));
                int hourse = Convert.ToInt32(tm[0]);
                int minutes = Convert.ToInt32(tm[1]);
                INTERVALS _i = new INTERVALS();
                _i.hourse = hourse;
                _i.minutes = minutes;
                _i.interval = 86400000.0;
                interv.Add(_i);
            }
            DateTime now = DateTime.Now;
            INTERVALS maininterval = new INTERVALS();
            foreach (INTERVALS h in interv)
            {
 
                    if (now.Hour == h.hourse && now.Minute == h.minutes)
                    {
                        double total = (double)h.hourse + ((double)h.minutes / 60);
                        timer.Stop();
                        double interval = 0.0;
                        foreach (INTERVALS z in interv)
                        {
                            if (z.total == total)
                                interval = z.interval;
                        }
                        timer.Interval = interval;
                        timer.Start();
                        maininterval = h;
                        test = true;
                    }
                    else
                    {
                        double totalnow = (double)now.Hour + ((double)now.Minute / 60);
                        if (interv.Count > 1)
                        {
                            int max = interv.Count - 1;
                            for (int i = 0; i < interv.Count; i++)
                            {
                                if (i == 0)
                                {
                                    if ((totalnow >= interv[i].total) && (totalnow > interv[max].total))
                                    {
                                        maininterval = interv[i];
                                    }
                                    if ((totalnow <= interv[i].total) && (totalnow < interv[max].total))
                                    {
                                        maininterval = interv[i];
                                    }
                                    if ((totalnow >= interv[i].total) && (totalnow < interv[i + 1].total))
                                    {
                                        maininterval = interv[i+1];
                                    }
 
                                }
                                else
                                {
                                    if (i != max)
                                    {
                                        if ((totalnow >= interv[i].total) && (totalnow < interv[i + 1].total))
                                        {
                                            maininterval = interv[i+1];
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            maininterval = interv[0];
                        }
                    }
                }
            int hourse1 = maininterval.hourse;
            int minutes1 = maininterval.minutes;
            double finish_interval = hourse1 + (double)minutes1 / 60;
            double start_interval = now.Hour + ((double)now.Minute / 60);
            double total_interval = interv[interv.IndexOf(maininterval)].interval / 3600000;
            if ((start_interval + total_interval) >= 24.0)
            {
                double f_interval = (start_interval + total_interval) - 24;
                if ((finish_interval <= f_interval) || (finish_interval > start_interval))
                {
                    timer.Stop();
                    if (finish_interval <= f_interval)
                    {
                        timer.Interval = ((24 - start_interval) + finish_interval) * 3600000;
                    }
                    if (finish_interval > start_interval)
                    {
                        timer.Interval = (finish_interval - start_interval) * 3600000;
                    }
                    timer.Start();
                }
 
            }
            else
            {
                if ((finish_interval > start_interval) && (finish_interval <= (start_interval + total_interval)))
                {
                    timer.Stop();
                    double _interv = finish_interval - start_interval;
                    timer.Interval = _interv * 3600000;
                    timer.Start();
                }
            }
            return test;
        }
 
}
 
    public class INTERVALS
    {
        public int hourse { get; set; }
        public int minutes { get; set; }
        public double total
        {
            get
            {
                return (double)hourse + ((double)minutes / 60);
            }
        }
        public double interval { get; set; }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2014, 11:08
Ответы с готовыми решениями:

Автоматическое нажатие кнопки в определённое время суток
Добрый день, подскажите пожалуйста. На форме есть кнопка. Как реализовать чтобы например каждый день в 17:15 и 17:20 происходило...

Запуск метода в определенное время
Ребят как запускать метод в определённое время каждый день ? Это должно работать в private void Form1_Load

Начало работы в определённое время суток
У меня есть определённый процесс, который будет выполняться каждый день в 0:00. Как это реализовать?

28
4 / 4 / 0
Регистрация: 14.03.2013
Сообщений: 29
15.01.2014, 17:22  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Этот код выполняет сортировку, работает, при этом достаточно быстро. Свой функционал (сортировка) - он выполняет. Вопрос: это хороший код?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int p,k,l,i,j,d,q,R,t,r;
  S1:    s=0; p=1;
  S2:    if (s==0) { i=1; j=n; k=n; l=2*n+1; }
         if (s==1) { i=n+1; j=2*n; k=0; l=n+1; }
         d=1; q=p; r=p;
  S3:    if (x[i]>K>x[j]->K) goto S8;
  S4:    k=k+d; x[k]=x[i]; c[k]=c[i];
  S5:    i+=1; q-=1; if (q>0) goto S3;
  S6:    k+=d; if (k==l) goto S13; else x[k]=x[j];c[k]=c[j];
  S7:    j-=1; r-=1; if (r>0) goto S6; else goto S12;
  S8:    k+=d; x[k]=x[j]; c[k]=c[j];
  S9:    j-=1; r-=1; if (r>0) goto S3;
  S10:   k+=d; if (k==l) goto S13; else x[k]=x[i];c[k]=c[i];
  S11:   i+=1; q-=1; if (q>0) goto S10;
  S12:   q=p; r=p; d=-d; t=k; k=l; l=t; if (j-i<p) goto S10; else goto S3;
  S13:   p+=p; if (p<n) { s=1-s; goto S2; }
         if (s==0) for (t=1; t<=n; t+=1) { x[t]=x[t+n];c[t]=c[t+n] }
Я так думаю все зависит от того, когда этот код написан, если году так в 2000, отчего плохой.
Уверен, во многих старых и возможно даже известных приложениях, такого кода ворох и маленькая охапка.

А давайте создадим класс, ну например Sorting, сделаем там метод sort(), запихаем туда весь этот код и скомпелируем в Sorting.dll
Напишем документацию к классу Sorting, в которой подробно опишем метод sort() - что и как он сортирует, какие параметры принимает.

А вот теперь
C#
1
2
3
4
5
6
7
8
using Sorting;
    class Program
    {
        static void Main(string[] args)
        {
        Sorting.sort();
        }
    }
Это уже хороший код?
Вы ведь понимаете что делает sort(), это подробно описано в документации к классу Sorting.
Как Вы сказали ранее - метод sort(), работает без багов, свои функции выполняет, работает достаточно быстро........
Дак чем получается плох тот код, который Вы привели?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
15.01.2014, 17:30
tezaurismosis, Вы можете сказать что это за алгоритм?

Цитата Сообщение от anton831 Посмотреть сообщение
Вы ведь понимаете что делает sort(), это подробно описано в документации к классу Sorting.
Т.е. по вашему хороший код характеризуется описанием?

Я вот например на вскидку буду еще разбираться с кодом, который привел tezaurismosis и что до описания, то мне хватает того, что это сортировка, вопрос в том почему она такая и смогу я (или вы) в нем разобраться.

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

Да и могу по себе сказать, каждый год я смотрю на свое творение прошлого года и думаю "Вот говнокодер".
0
4 / 4 / 0
Регистрация: 14.03.2013
Сообщений: 29
15.01.2014, 17:43  [ТС]
Grishaco, А вы когда пользуетесь стандартными методами и классами .NET, пытаетесь разобраться "почему они такие" и разбираетесь в исходниках net.framework?

По мне дак, достаточно описаний из msdn, то есть понимания, что делает тот или иной метод.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
15.01.2014, 17:47
Цитата Сообщение от anton831 Посмотреть сообщение
А вы когда пользуетесь стандартными методами и классами .NET, пытаетесь разобраться "почему они такие" и разбираетесь в исходниках net.framework?
Очень часто так делаю и не только net.framework, но и другие библиотеки. Например мне нужна всего одна функция зачем мне тащить с собой кучу Dll. Я посмотрел, скопировал код и все работает. DevExpress часто правлю. DevExpress так вообще исходники дают при покупке.
0
4 / 4 / 0
Регистрация: 14.03.2013
Сообщений: 29
15.01.2014, 18:04  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
Очень часто так делаю и не только net.framework, но и другие библиотеки. Например мне нужна всего одна функция зачем мне тащить с собой кучу Dll. Я посмотрел, скопировал код и все работает. DevExpress часто правлю. DevExpress так вообще исходники дают при покупке.
Почему кучу? Вы тащите только ту .dd ку, в которой содержится тот метод, что вам нужен.
И как повлияет на работу приложения если там еще методы будут, которые Вы в приложении не пользуете??
Ну и пусть они будут в ней. У меня вообще одна библиотека классов используется в нескольких (правда связанных) проектах, что в этом такого? Одни классы используются в одном проекте, одни в другом, а другие в обоих.

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

Добавлено через 8 минут
И кстати, вы открывали исходники этого.
Как по мне, разобраться в них для меня будет куда более проблематично, чем в одном единственном методе, который я привел в начале темы (даже с условием, что он несколько длинноват и без комментариев).
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
15.01.2014, 18:08
Цитата Сообщение от anton831 Посмотреть сообщение
Почему кучу? Вы тащите только ту .dd ку, в которой содержится тот метод, что вам нужен.
В том то и дело, что она не одна, а их множество. В итоге проект обрастает кучей Dll (не считая проектных) и плюс ко всему растет в весе.

Цитата Сообщение от anton831 Посмотреть сообщение
На разбор различных библиотек, уйдет непомерно много времени.
Так никто и не говорит, что их нужно разбирать до конца. Вот простой пример нужен был контрол отображения HTML, браузер не подходит, т.к. в нем нету необходимой функциональности. Соответственно такой контрол был найден, но с ним в догонку шли еще куча библиотек. Соответственно выдернув только самое необходимое остался только код контрола, а не нужные библиотеки выкинулись.

Цитата Сообщение от anton831 Посмотреть сообщение
И кстати, вы открывали исходники этого.
Нет не открывал, просто подцепил, причитал 1 страницу описания работы и использовал в своем коде. При этом расписание настраивает пользователь и ему я дал ссылку на это описание, теперь они могут делать расписание какое захотят. В вашем же случае каждое пожелание пользователя - это доработка кода.

Я не говорю, что слепо надо использовать все сторонние библиотеки. Выбирать вам. Я тоже так начинал писать свои велосипеды, вот только как дошло до промышленной разработки понял, что лучше выдернуть рабочий код (подправив в нем кое что) и не парится. Я же в конце концов не один программист, есть и другие, которые что то делают лучше меня.
0
4 / 4 / 0
Регистрация: 14.03.2013
Сообщений: 29
15.01.2014, 18:13  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
В вашем же случае каждое пожелание пользователя - это доработка кода.
Дак я и не заявлял большее, чем этот метод делает.
Я просто понять не могу, чем код то в нем плох?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
15.01.2014, 19:51
Цитата Сообщение от anton831 Посмотреть сообщение
Я просто понять не могу, чем код то в нем плох?
Никто не говорит, что он плохой. Я вам просто сказал, что есть уже решение, при чем хорошее.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
15.01.2014, 20:02
Цитата Сообщение от Grishaco Посмотреть сообщение
Вы можете сказать что это за алгоритм?
Ещё не разбирался, и это будет достаточно затруднительно. Искал пример ярко выраженного спагетти-кода, к нему прилагалось его назначение. Если разберусь, отпишусь обязательно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2014, 20:02
Помогаю со студенческими работами здесь

Выполнение функции в определенное время
Здравствуйте! Пишу прототип футбольного менеджера. Класс Match имеет функцию Play() и если в один день есть три матча, назначенные на...

Выполнение задачи в определенное время
Доброго времени суток всем. задача такова, пользователь задает время копирования (к примеру 05:00), далее программа должна каждый день в 5...

Выполнение метода в определённое время
Здравствуйте. Мне необходимо, чтобы некий метод выполнился в определённое время, на пример в 14:16. У меня на этот счёт было несколько...

Выполнение метода происходит определённое время
Здравствуйте! Задача: отдельная строка кода(6) должна выполняться определённое время. Причина : картинка появляется на совсем маленькое...

Notification в определенное время суток
Я создал уведомление, которое срабатывает по нажатию кнопки, сразу. Что нужно дописать в коде, чтобы уведомление срабатывало, скажем в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru