Форум » [x]Harbour » Запуск процедуры по расписанию. » Ответить

Запуск процедуры по расписанию.

Dima: Есть многопоточная задача. Понадобилось по расписанию запускать некую процедуру для формирования неких данных. Интервал срабатывания скажем с 9-00 утра до 21-00 с интервалом в 2 часа. Накидал простой алгоритм , потестил и вроде все норм. Ежели есть какой то более продвинутый вариант , готов выслушать. Вот "полу-сырец" (в нем нет потока так как просто тест) [pre2] 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 [/pre2]

Ответов - 15

Петр: Dima пишет: Ежели есть какой то более продвинутый вариант , готов выслушать. Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью WinAPI, а именно таймеров ожидания (waitable timer). Сейчас нет под руками, но через выходные могу выложить, если конечно будет интересно, функции и пример использования c MiniGUI.

Dima: Петр пишет: Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью WinAPI, а именно таймеров ожидания (waitable timer). Все так плохо у меня ? Петр пишет: если конечно будет интересно, функции и пример использования c MiniGUI. Интересно , но в данном случае у меня чистая консоль.

Петр: Dima пишет: Все так плохо у меня ? Почему сразу плохо. Просто спрашивали о другом варианте. Dima пишет: но в данном случае у меня чистая консоль. Значит пример напишу для консоли.

Dima: Петр пишет: Значит пример напишу для консоли. Было бы интересно взглянуть !

Sergy: Реализовал аналогичную задачу средствами Windows: Команда AT предназначена для запуска команд и программ в указанное время по определенным дням. Для использования команды AT необходимо, чтобы была запущена служба расписаний. AT [\\имя_компьютера] [ [ИД] [/DELETE] | /DELETE [/YES]] AT [\\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,...] | /NEXT:день[,...]] "команда" \\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен, используется локальный компьютер. код Порядковый номер запланированной задачи. /delete Отмена запланированной задачи. Если код задачи опущен, отменяются все задачи, запланированные для указанного компьютера. /yes Отмена запроса на подтверждение при отмене всех запланированных задач. время Время запуска команды. /interactive Разрешение взаимодействия задачи с пользователем, работающим на компьютере во время запуска задачи. /every:день[,...] Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день месяца. /next:день[,...] Задача будет запущена в следующий указанный день недели (например, в следующий четверг). Если дата опущена, используется текущий день месяца. "команда" Команда Windows NT или имя пакетного файла. Из плюсов: 1) настройки расписания и журнал вызовов доступны в т.ч. сисадмину, а не только программисту. 2) нет нужды в многопоточности (хоть чуть, но mt-код работает медленнее) 3) программа вызывается, отрабатывает и завершается полностью, не расходуя ресурсы. Понятно что их много, но зачем тратить память/такты процессора напрасно?

Dima: Sergy Спасибо за вариант , но не подходит. Задачка у меня не единичная. Работает MT робот и у него множество задач: архивация базы , отправка заявок поставщикам , прием заявок от торговых включая кассу ,обслуживание связки андроид приложения с нашей учетной системой , вызов сисадмина по смс , отправка заявок по смс , отправка накладных по смс или почте , отправка остатков , отправка дебиторки по мылу , отправка данных в систему SPOT2D и тд и тп , функций много.

SergKis: Dima пишет готов выслушать. Мой вариант:[pre2] 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) , ) }) // что запущено убрали [/pre2] oKeyData() с классом в теме МиниГуи

Dima: SergKis пишет: ON TIMER по nTime Интересно конечно и спасибо , но Сергей у меня консолька. И потом не все задачи работают по расписанию , есть те что работают по запросу или какому то событию.

SergKis: Dima ON TIMER это образное выражение, читай цикл через промежуток времени. Класс TKeyData - это сложная процедура, не связанная с минигуи окнами, переноси, добавь #include "hbclass.ch" РС не мой, тороплюсь, выше не точность, надо[pre2] s += t oEventZ:Set(ы, k) ENDDO [/pre2] и это только проверка наступления события из расписания, в блоке кода можешь проверять что угодно. Не настаиваю

Dima: SergKis пишет: ON TIMER это образное выражение, читай цикл через промежуток времени. OK

Петр: Dima пишет: Было бы интересно взглянуть ! Создание waitable timer objects и timer queues Примеры и библиотека для mingw 6.3.0./hb32 wintimers.7z или wintimers.7z Примеры на базе примеров MSDN, не слишком навороченные, но надеюсь, что понятные. UPD: не забываем подключать hbwin

Dima: Петр 4shared обменник еще тот скачал , буду изучать , спасибо !

Петр: Dima пишет: 4shared обменник еще тот Все, что я о нем знаю - это то, что достаточно удобно загружать и 15 Гб места бесплатно. К чему еще можно присмотреться?

Sergy: Петр пишет: Все, что я о нем знаю - это то, что достаточно удобно загружать и 15 Гб места бесплатно. К чему еще можно присмотреться? Хотел скачать, чтобы изучить таймеры - не вышло. Требует либо регистрации, либо установки плагина к браузеру, либо входа через соцсети, в которых я не зареген. Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков.

Петр: Sergy пишет: Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков. О google я забыл..



полная версия страницы