Автор | Сообщение |
|
| |
Пост N: 6471
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.17 07:58. Заголовок: Запуск процедуры по расписанию.
Есть многопоточная задача. Понадобилось по расписанию запускать некую процедуру для формирования неких данных. Интервал срабатывания скажем с 9-00 утра до 21-00 с интервалом в 2 часа. Накидал простой алгоритм , потестил и вроде все норм. Ежели есть какой то более продвинутый вариант , готов выслушать. Вот "полу-сырец" (в нем нет потока так как просто тест) Proc Main Local elem Local nSec Public Htime IniHtime() Do while .t. hb_releaseCPU() if seconds()>82800 // после 23-00 снова инициализируем массив IniHtime() endif nSec:=Seconds() For each elem in Htime if !elem if nSec>=elem:__enumkey() * Тут запускем нужную процедуру * MyFunc() * Htime[elem:__enumkey()]:=.T. exit endif endif Next /* ... ... */ Enddo return ******************** Func IniHtime() Local j Htime:={=>} For j=9 to 21 Step 2 Htime[ j*3600 ]:=.F. Next return nil
|
|
|
Новых ответов нет
[см. все]
|
|
|
| постоянный участник
|
Пост N: 1536
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.06.17 11:42. Заголовок: Dima пишет: Ежели е..
Dima пишет: цитата: | Ежели есть какой то более продвинутый вариант , готов выслушать. |
| Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью WinAPI, а именно таймеров ожидания (waitable timer). Сейчас нет под руками, но через выходные могу выложить, если конечно будет интересно, функции и пример использования c MiniGUI.
|
|
|
|
| |
Пост N: 6472
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.17 12:23. Заголовок: Петр пишет: Не знаю..
Петр пишет: цитата: | Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью WinAPI, а именно таймеров ожидания (waitable timer). |
| Все так плохо у меня ? Петр пишет: цитата: | если конечно будет интересно, функции и пример использования c MiniGUI. |
| Интересно , но в данном случае у меня чистая консоль.
|
|
|
|
| постоянный участник
|
Пост N: 1537
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.06.17 13:01. Заголовок: Dima пишет: Все так..
Dima пишет: Почему сразу плохо. Просто спрашивали о другом варианте. Dima пишет: цитата: | но в данном случае у меня чистая консоль. |
| Значит пример напишу для консоли.
|
|
|
|
| |
Пост N: 6473
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.06.17 13:02. Заголовок: Петр пишет: Значит ..
Петр пишет: цитата: | Значит пример напишу для консоли. |
| Было бы интересно взглянуть !
|
|
|
|
| |
Пост N: 549
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.06.17 23:05. Заголовок: Реализовал аналогичн..
Реализовал аналогичную задачу средствами Windows: Команда AT предназначена для запуска команд и программ в указанное время по определенным дням. Для использования команды AT необходимо, чтобы была запущена служба расписаний. AT [\\имя_компьютера] [ [ИД] [/DELETE] | /DELETE [/YES]] AT [\\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,...] | /NEXT:день[,...]] "команда" \\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен, используется локальный компьютер. код Порядковый номер запланированной задачи. /delete Отмена запланированной задачи. Если код задачи опущен, отменяются все задачи, запланированные для указанного компьютера. /yes Отмена запроса на подтверждение при отмене всех запланированных задач. время Время запуска команды. /interactive Разрешение взаимодействия задачи с пользователем, работающим на компьютере во время запуска задачи. /every:день[,...] Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день месяца. /next:день[,...] Задача будет запущена в следующий указанный день недели (например, в следующий четверг). Если дата опущена, используется текущий день месяца. "команда" Команда Windows NT или имя пакетного файла. Из плюсов: 1) настройки расписания и журнал вызовов доступны в т.ч. сисадмину, а не только программисту. 2) нет нужды в многопоточности (хоть чуть, но mt-код работает медленнее) 3) программа вызывается, отрабатывает и завершается полностью, не расходуя ресурсы. Понятно что их много, но зачем тратить память/такты процессора напрасно?
|
|
|
|
| |
Пост N: 6475
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.17 13:52. Заголовок: Sergy Спасибо за ва..
Sergy Спасибо за вариант , но не подходит. Задачка у меня не единичная. Работает MT робот и у него множество задач: архивация базы , отправка заявок поставщикам , прием заявок от торговых включая кассу ,обслуживание связки андроид приложения с нашей учетной системой , вызов сисадмина по смс , отправка заявок по смс , отправка накладных по смс или почте , отправка остатков , отправка дебиторки по мылу , отправка данных в систему SPOT2D и тд и тп , функций много.
|
|
|
|
| постоянный участник
|
Пост N: 1555
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.17 15:55. Заголовок: Dima пишет готов выс..
Dima пишет Мой вариант: oZada4 := oKeyData() // список задач и через сколько что запускать oZada4:Set("Arhiv1" , { 2*60*60, {|| ... }} ) oZada4:Set("Arhiv2" , { 3*60*60, {|| ... }} ) oZada4:Set("KliZTo" , { 1*60*60, {|| ... }} ) oZada4:Set("KliZFrom", { 1*60*60, {|| ... }} ) oZada4:Set("NaklTo" , {0.5*60*60, {|| ... }} ) oZada4:Set("NaklFrom", {0.5*60*60, {|| ... }} ) oZada4:Set("SmsTo" , {0.2*60*60, {|| ... }} ) ... nTime := 10*60 // время таймера проверки запуска oEventZ := oKeyData() // события\расписание запуска создаем a := oZada4:Eval() For i := 1 To len(a) k := a[ i ][1] // задача t := a[ i ][2] // через сколько запускать s := 0 DO WHILE s < 82800 oEventZ:Set(t, k) s += t ENDDO Next // когда надо снова создаем расписание\события из oZada4 ON TIMER по nTime интервалу делает: oEventZ:Eval({|k,s,i,l,a| i := Seconds(), a := oZada4:Get(k), ; l := (s >= i-nTime) .and. s <= (i+nTime), ; iif( l, oZada4:Do (a[2]), ), ; // запуск делаем iif( l, oZada4:Del(k) , ) }) // что запущено убрали oKeyData() с классом в теме МиниГуи
|
|
|
|
| |
Пост N: 6476
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.17 15:58. Заголовок: SergKis пишет: ON T..
SergKis пишет: Интересно конечно и спасибо , но Сергей у меня консолька. И потом не все задачи работают по расписанию , есть те что работают по запросу или какому то событию.
|
|
|
|
| постоянный участник
|
Пост N: 1556
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.06.17 16:46. Заголовок: Dima ON TIMER это о..
Dima ON TIMER это образное выражение, читай цикл через промежуток времени. Класс TKeyData - это сложная процедура, не связанная с минигуи окнами, переноси, добавь #include "hbclass.ch" РС не мой, тороплюсь, выше не точность, надо s += t oEventZ:Set(ы, k) ENDDO и это только проверка наступления события из расписания, в блоке кода можешь проверять что угодно. Не настаиваю
|
|
|
|
| |
Пост N: 6477
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.06.17 16:48. Заголовок: SergKis пишет: ON T..
SergKis пишет: цитата: | ON TIMER это образное выражение, читай цикл через промежуток времени. |
| OK
|
|
|
|
| постоянный участник
|
Пост N: 1539
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.06.17 20:54. Заголовок: Dima пишет: Было бы..
Dima пишет: цитата: | Было бы интересно взглянуть ! |
| Создание waitable timer objects и timer queues Примеры и библиотека для mingw 6.3.0./hb32 wintimers.7z или wintimers.7z Примеры на базе примеров MSDN, не слишком навороченные, но надеюсь, что понятные. UPD: не забываем подключать hbwin
|
|
|
|
|
| |
Пост N: 6480
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.06.17 21:47. Заголовок: Петр 4shared обменн..
Петр 4shared обменник еще тот скачал , буду изучать , спасибо !
|
|
|
|
| постоянный участник
|
Пост N: 1540
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.06.17 22:06. Заголовок: Dima пишет: 4share..
Dima пишет: Все, что я о нем знаю - это то, что достаточно удобно загружать и 15 Гб места бесплатно. К чему еще можно присмотреться?
|
|
|
|
| |
Пост N: 550
Зарегистрирован: 08.07.06
|
|
Отправлено: 25.06.17 22:45. Заголовок: Петр пишет: Все, чт..
Петр пишет: цитата: | Все, что я о нем знаю - это то, что достаточно удобно загружать и 15 Гб места бесплатно. К чему еще можно присмотреться? |
| Хотел скачать, чтобы изучить таймеры - не вышло. Требует либо регистрации, либо установки плагина к браузеру, либо входа через соцсети, в которых я не зареген. Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков.
|
|
|
|
| постоянный участник
|
Пост N: 1541
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.06.17 23:02. Заголовок: Sergy пишет: Облако..
Sergy пишет: цитата: | Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков. |
| О google я забыл..
|
|
|
|