Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Как лучше - по шедуллеру или из бесконечного цикла? : Программирование

20.04.2024 15:44


25.03.2013 16:28
Aleks_Str
 
Задача: раз в три минуты сделать какое-либо действие. В частности - из фронт-офиса перенести чеки в бэк.
Накропал функцию, которую скомпилировал (ну, если так можно сказать про ФоксПро) в экзешник и загнал его в шедулер запускаться раз в три минуты.
Вопрос: а может лучше сделать бесконечный цикл, который будет эту функцию вызывать примерно так:

10 ОБРАБОТАТЬ ЧЕКИ
20 ЖДИ 3 МИНУТЫ
30 ГОТО 10

скомпилить его в екзешник и запускать из автостарта?
25.03.2013 16:35
OlegON
 
Я очень не люблю циклы и постоянно висящие в фоне программы.
Во-первых, программа, висящая в фоне, жрет ресурсы и может "течь", что еще больше усугубит ситуацию. Кроме того, если "ЖДИ" - это отсчет от 0 до 100500, то это вообще жесть.
Во-вторых, она может зависнуть (в виндошедалере есть прибитие по истечении времени).

голосую за шедалер.
25.03.2013 16:45
baggio
 
поддержу олега...
а вообще можно как всегда скрестить берёзу и ананас...
25.03.2013 21:31
KirillHome
 
А я бы скорее кинул всё это в bat-файл.

@echo off
:BgWait
rem подождём три минуты
ping -n 1 -w 180000 127.0.0.1
rem сделаем нужные нам действия
rem ...можно проверять наличие запущенной программы
rem ...с нужным нам именем и т.д.
rem к примеру - проверим флаг ошибок
if exist c:\temp\problem.err goto ExitErr
rem если всё в порядке - запустим нужное нам..
...
rem и вернёмся в начало
goto BgWait
rem - действия в случае наличия флага ошибок
:ExitErr
.....

По сути дела - тот же "шедуллер", но своими руками, плюс - дополнительные обработки.

Чем этот вариант для меня лучше - можно проверить наличие "ошибок", сделать какие-либо действия (подождать ещё, убить "зависший процесс", отправить письмо/SMS и т.д.) в случае необходимости.
25.03.2013 21:40
OlegON
 
извини, не соглашусь...
во-первых, задержку надо вставлять в конце цикла, чтобы не ждать три минуты, если захочешь запустить вручную.
во-вторых, если где-то среди rem повиснет, то ой... до убийства зависших процессов можно дойти только запуская через start, но тогда теряешь контроль над окончанием работы программы, что тянет за собой написание монстроидальной конструкции... в варианте с шедалером ничто не мешает производить проверки, зато вариантов задания расписания куда больше.
25.03.2013 23:50
KirillHome
 
Извиняю - каждый выбирает свой путь :)

К примеру:
Во-первых, для "однократного" запуска - я просто запущу то, что должно запускаться "в случае успешного прохождения проверки"

Во-вторых, для задач, повторяемых через небольшой промежуток времени (наверное, при условии, что промежуток ... до 15-20 минут), мне (ключевое слово - "мне") кажется более правильным использовать именно такие конструкции, а не шедуллер.

В-третьих, меня "монстроподобные" тексты bat-файлов не пугают, при этом - при переносе подобных заданий с одного компьютера на другой - даже не задумываешься - что там за операционка ("зоопарк" клиентских машин - Win'95/Win'98/Win'XP/Win'7) - оно работает.

И вообще - картинка в тему :)
26.03.2013 08:30
Aleks_Str
 
Сенькс.
Оставлю как есть - через шедулер.
26.03.2013 09:11
student
 
если это связано с файликами - я бы сделал через подписку на wmi - типа появление любого файлика в каталоге c:\test\

======================================
strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceCreationEvent Within 5 Where " _
& "Targetinstance Isa 'CIM_DirectoryContainsFile' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""c:\\\\TEST""'")

Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
======================================

если не с файликами :) то аналогичным образом поискал бы другое событие - можно тот же таймер - просто подобная схема не зависит от шедулера и в отличии от бесконечного цикла не грузит систему
26.03.2013 13:30
Aleks_Str
 
Было-бы событие "В таблице ***** появилась запись" или "Выгружен чек" - воспользовался-бы этим событием с удовольствием.
А так - приходится извращаться
26.03.2013 14:07
student
 
Цитата:
Aleks_Str Было-бы событие "В таблице ***** появилась запись" или "Выгружен чек" - воспользовался-бы этим событием с удовольствием.
А так - приходится извращаться
а банальный триггер на табличку не прокатит? если конечно это не файловая табличка\база (dbf\db)...
Часовой пояс GMT +3, время: 15:44.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.