On-line: Pasha, Haz, гостей 1. Всего: 3 [подробнее..]
АвторСообщение
администратор




Пост 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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 15 [только новые]


постоянный участник


Пост N: 1536
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.06.17 11:42. Заголовок: Dima пишет: Ежели е..


Dima пишет:

 цитата:
Ежели есть какой то более продвинутый вариант , готов выслушать.


Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью
WinAPI, а именно таймеров ожидания (waitable timer).

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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6472
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.06.17 12:23. Заголовок: Петр пишет: Не знаю..


Петр пишет:

 цитата:
Не знаю, насколько это "продвинуто" или нет, что-то подобное можно выполнить с помощью
WinAPI, а именно таймеров ожидания (waitable timer).


Все так плохо у меня ?

Петр пишет:

 цитата:
если конечно будет интересно, функции и пример использования c MiniGUI.


Интересно , но в данном случае у меня чистая консоль.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1537
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.06.17 13:01. Заголовок: Dima пишет: Все так..


Dima пишет:

 цитата:
Все так плохо у меня ?


Почему сразу плохо. Просто спрашивали о другом варианте.
Dima пишет:

 цитата:
но в данном случае у меня чистая консоль.


Значит пример напишу для консоли.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6473
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.06.17 13:02. Заголовок: Петр пишет: Значит ..


Петр пишет:

 цитата:
Значит пример напишу для консоли.


Было бы интересно взглянуть !

Спасибо: 0 
ПрофильЦитата Ответить





Пост 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) программа вызывается, отрабатывает и завершается полностью, не расходуя ресурсы. Понятно что их много, но зачем тратить память/такты процессора напрасно?


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6475
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.06.17 13:52. Заголовок: Sergy Спасибо за ва..


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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() с классом в теме МиниГуи


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6476
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.06.17 15:58. Заголовок: SergKis пишет: ON T..


SergKis пишет:

 цитата:
ON TIMER по nTime


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6477
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.06.17 16:48. Заголовок: SergKis пишет: ON T..


SergKis пишет:

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


OK

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6480
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.06.17 21:47. Заголовок: Петр 4shared обменн..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1540
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.06.17 22:06. Заголовок: Dima пишет: 4share..


Dima пишет:

 цитата:
4shared обменник еще тот


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


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 550
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 25.06.17 22:45. Заголовок: Петр пишет: Все, чт..


Петр пишет:

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


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

Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1541
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.06.17 23:02. Заголовок: Sergy пишет: Облако..


Sergy пишет:

 цитата:
Облако Mail.ru, Яндекс-диск, dropbox, google - не имеют таких головняков.


О google я забыл..

Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 399
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет