|
Как в 1С кошерно реализовать задержку (delay, sleep и т. д.)? | ☑ | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0
PR
01.11.13
✎
12:04
|
Из вариантов я знаю пустой цикл, но тут многие предлагают за тако расстреливать, как за GOTO.
А что в нем некошерного, кстати? И какие есть кошерные решения? Или их нет? :)) |
||||||||||
1
vhl
01.11.13
✎
12:06
|
wsh
|
||||||||||
2
PR
01.11.13
✎
12:06
|
(1) 70
|
||||||||||
3
mikecool
01.11.13
✎
12:07
|
сходи в КЗ чтоле
|
||||||||||
4
vhl
01.11.13
✎
12:08
|
Процедура Пауза(ИнтервалОжидания=1000) Экспорт
#Если Клиент Тогда Скрипт=Новый ТекстовыйДокумент; Скрипт.УстановитьТекст ( "if (WScript.Arguments.Count()==0) | WScript.Quit(); |else | if (isNaN(parseInt(WScript.Arguments(0)))) | WScript.Quit(); |WScript.Sleep(WScript.Arguments(0));" ); Скрипт.Записать(КаталогВременныхФайлов()+"sleep.js",КодировкаТекста.ANSI); WshShell=Новый COMОбъект("wscript.shell"); WshShell.Run("wscript.exe """+КаталогВременныхФайлов()+"sleep.js"" "+Формат(ИнтервалОжидания,"ЧГ=0"),0,-1); УдалитьФайлы(КаталогВременныхФайлов()+"sleep.js"); #КонецЕсли конецпроцедуры Не помню у кого украл |
||||||||||
5
PR
01.11.13
✎
12:09
|
(3) Там есть кошерное решение или ты так просто сказал? :))
|
||||||||||
6
0xFFFFFF
01.11.13
✎
12:09
|
Цикл тогда уж с запросом. Так надежнее.
|
||||||||||
7
H A D G E H O G s
01.11.13
✎
12:09
|
Функция Sleep/SleepEx библиотеки Kernel32.dll
Остальное - хрень. |
||||||||||
8
Lama12
01.11.13
✎
12:09
|
Остальные варианты привязаны к ОС сервера приложений.
Пустой цикл вполне кошерен |
||||||||||
9
PR
01.11.13
✎
12:10
|
(4) Это кошернее пустого цикла?
|
||||||||||
10
Lama12
01.11.13
✎
12:10
|
(7) И как это будет работать на линуксе?
В 8.3 и клиент может работать в линуксе. |
||||||||||
11
vhl
01.11.13
✎
12:11
|
(9) Ты вообще понимаешь в чем разница между пусты циклом и командой sleep?
|
||||||||||
12
H A D G E H O G s
01.11.13
✎
12:11
|
(10) Линукс? Не, не слышал.
|
||||||||||
13
1dvd
01.11.13
✎
12:12
|
(10) Извращенцев в расчет не берём
|
||||||||||
14
МихаилМ
01.11.13
✎
12:12
|
для серверного варианта
через ОжидатьЗавершения реализуется. но с точностью до 2 сек |
||||||||||
15
йети
01.11.13
✎
12:13
|
прыгай от ТекущаяУниверсальнаяДатаВМиллисекундах()
|
||||||||||
16
PR
01.11.13
✎
12:13
|
(11) Понимаю.
В данном случае 1С будет ждать окончания работы скрипта? |
||||||||||
17
Lama12
01.11.13
✎
12:13
|
(15) О! Кстати вариант.
|
||||||||||
18
Зойч
01.11.13
✎
12:14
|
кошерно не реализовывать задержку, а делать на событиях
|
||||||||||
19
vhl
01.11.13
✎
12:15
|
(16) Билин, а нафига эта функция по твоему нужна?!!!
|
||||||||||
20
PR
01.11.13
✎
12:17
|
(18) Как ты это собираешься делать в общем случае?
|
||||||||||
21
PR
01.11.13
✎
12:17
|
(19) Тогда задам вопрос по-другому.
Чем она кошернее пустого цикла? :)) |
||||||||||
22
vhl
01.11.13
✎
12:18
|
(21) DAFAQ? Пустой цикл тебе загрузит процессор на 100%, а sleep на 0. Еще вопросы?
|
||||||||||
23
SoulPower
01.11.13
✎
12:19
|
Предыстория создания ветки:
Необходимо реализовать задержку после загрузки страницы в ИЕ. Подождать пока загрузиться страничка. Я сделал: While IE.ReadyState < 4 Do EndDo; Роман говорит - не кошерно, нужен обработчик ожидания. Конкретно для этой задачи. Пустой цикл вполне кошерен |
||||||||||
24
mikeA
01.11.13
✎
12:20
|
(0) ну так чисто чтоб поржать:
cmdLine= "ping -n " + Формат(ЧислоСекунд + 1, "ЧГ=0") + " 127.0.0.1"; WshShell = Новый COMОбъект("WScript.Shell"); WshShell.Run(cmdLine, 0, -1); Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
25
Зойч
01.11.13
✎
12:20
|
(20) зачем нужны общие случаи???
|
||||||||||
26
Зойч
01.11.13
✎
12:22
|
(23) у хтмл документа есть событие - документ сформирован
|
||||||||||
27
SoulPower
01.11.13
✎
12:22
|
В голосовалке явно нужен пункт - 4. Своё мнение.
|
||||||||||
28
vhl
01.11.13
✎
12:27
|
(18) На самом деле верно. Последний раз заморачивался паузами лет 6 назад когда был новчиком. Сейчас почему-то все стандартными механизмами получается - вроде (26).
|
||||||||||
29
SoulPower
01.11.13
✎
12:28
|
(26) Как мне юзать это событие для Com объекта IE ?
|
||||||||||
30
Ksandr
01.11.13
✎
12:33
|
вот пятничное решение:
Берем плату stm32 к ней цепляем реле, провод из розетки через реле к человеку-таймеру void main() { // Не забудь инициализировать GPIO здесь. // Инициализация таймера RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef timer_base; TIM_TimeBaseStructInit(&timer_base); timer_base.TIM_Prescaler = 15; timer_base.TIM_Period = #Задержка в мкс# TIM_TimeBaseInit(TIM3, &timer_base); TIM_Cmd(TIM3, ENABLE); NVIC_EnableIRQ(TIM3_IRQn); } void TIM3_IRQHandler(void) { тут подаем 5В на реле } Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
31
Fragster
модератор
01.11.13
✎
12:36
|
зависит от контекста. на клиенте - обработчик ожидания, на сервере -
Процедура Пауза(Сек = 1) Экспорт Инфо = Новый СистемнаяИнформация(); Если Инфо.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ Инфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ЗапуститьПриложение("ping -n " + Формат(1 + Сек, "ЧДЦ=0; ЧГ=") + " 127.0.0.1", , Истина); // windows Иначе ЗапуститьПриложение("ping -c " + Формат(1 + Сек, "ЧДЦ=0; ЧГ=") + " 127.0.0.1", , Истина); // linux КонецЕсли; КонецПроцедуры |
||||||||||
33
PR
01.11.13
✎
12:39
|
(25) Ну как. Хочу процедуру, которая у меня вернет все обратно через x секунд :))
|
||||||||||
34
H A D G E H O G s
01.11.13
✎
12:40
|
(30) А ты опасный парень
|
||||||||||
35
PR
01.11.13
✎
12:41
|
(32) Конечно нет. Если говорить про общий случай.
|
||||||||||
37
PR
01.11.13
✎
12:45
|
(36) Общий случай — это когда есть код из 100 000 000 000 000 000... строк кода и его принципиально нельзя и неправильно расхреначивать в разные процедуры, до и после обработчика ожидания.
То есть просто хотелось бы в нужных местах написать что-то типа ПодождемНемного(5) и все :)) |
||||||||||
38
User_Agronom
01.11.13
✎
12:47
|
По сабжу. Точно да. Никогда не сталкивался. Когда-то что-то ваял на Delphi как-то хорошо обходилось. А сейчас таких задач не возникало.
Написал, чтобы почитать потом к какому выводу пришли. (13) Не извращенцев. Просвященных :) Пустой цикл некошерен, я не знаю кошерного решения |
||||||||||
40
PR
01.11.13
✎
12:48
|
(39) За шкафом :))
|
||||||||||
41
DJ Anthon
01.11.13
✎
12:49
|
(39) создать видимость работы.
|
||||||||||
42
SoulPower
01.11.13
✎
12:51
|
(39) - > (23)
|
||||||||||
43
Зойч
01.11.13
✎
12:53
|
(41) клиент просто не заплатил, нужно немного затормозить работу его 1ски ))
|
||||||||||
45
Зойч
01.11.13
✎
12:54
|
(44) в 8.3 не будет работать ))
|
||||||||||
47
SoulPower
01.11.13
✎
12:56
|
(44) ты смешной.)
|
||||||||||
48
eklmn
гуру
01.11.13
✎
12:57
|
Отойдите все от компьютера!
|
||||||||||
49
oleg_km
01.11.13
✎
12:57
|
(43) В таком случае действительно лучше пустой цикл. Или чикл с вычислением синуса, чтобы и цифровой сопроцессор загрузить
|
||||||||||
51
WickeD
01.11.13
✎
12:58
|
|||||||||||
53
H A D G E H O G s
01.11.13
✎
13:00
|
(51) Хрень.
|
||||||||||
54
toypaul
гуру
01.11.13
✎
13:00
|
"Из вариантов я знаю пустой цикл, но тут многие предлагают за тако расстреливать, как за GOTO.
А что в нем некошерного, кстати?" придется ополовинить 22 |
||||||||||
55
PR
01.11.13
✎
13:02
|
(50) А как его можно не юзать, когда нужно что-то грузануть с нета, при этом весьма изощренно авторизоваться на сайте, попереходить по разным закладкам и прочее?
|
||||||||||
56
toypaul
гуру
01.11.13
✎
13:03
|
(55) еще урезать половину от половины 22
|
||||||||||
58
PR
01.11.13
✎
13:05
|
(54) Ну отрежь немного от полуметра, разрешаю :))
|
||||||||||
60
capitanjack1
01.11.13
✎
13:09
|
Всё что предлагают в качестве "решений" тут полная туфта. Возьму конфу "Нетленка" оттуда внешнюю компоненту, в ней есть возможность паузы делать.
|
||||||||||
61
Повелитель
01.11.13
✎
13:11
|
(57) Норм, сейчас встрою ))
|
||||||||||
62
User_Agronom
01.11.13
✎
13:11
|
(31) Вариант ещё некошернее.
Конечно, похвастаться знанием работы с мультиплатформеностью здорово, но лучше всё- таки решать в пределах одной системы. Например, так: Процедура ДелАй(Сек = 1) СтартДата = ТекущаяДата(); ТекДата = СтартДата; Пока ТекДата <= (СтартДата + Сек) цикл ТекДата = ТекущаяДата(); КонецЦикла; КонецПроцедуры Этот способ тоже плох, но гораздо лучше 31-го. |
||||||||||
63
Зойч
01.11.13
✎
13:11
|
(59) если с помощью аякса страничка формируется, то не так просто ее получить будет обычными способами
|
||||||||||
64
VladZ
01.11.13
✎
13:12
|
(0) Зачем?
|
||||||||||
65
User_Agronom
01.11.13
✎
13:12
|
(57) Функция должна чего-то возвращать. Процедура наверное
|
||||||||||
66
le_
01.11.13
✎
13:13
|
(0) Вот здесь расписано:
http://kb.mista.ru/article.php?id=98 А пустой цикл - это зло, которое процессор на 100% может загрузить. Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
67
Повелитель
01.11.13
✎
13:13
|
(65) Необязательно
|
||||||||||
68
PR
01.11.13
✎
13:15
|
(59) Да ХЗ.
Сначала не разобрались с обработкой ReadyState, а потом уж не стали переделывать. |
||||||||||
69
PR
01.11.13
✎
13:15
|
+(68) Опять же, могут быть проблемы со всякими FetElementByID возможно
|
||||||||||
70
МихаилМ
01.11.13
✎
13:17
|
с точностью до секунд (+-5%)
можно использовать HTTPСоединение Процедура КнопкаСформироватьНажатие(Кнопка) ввв(); КонецПроцедуры Процедура ввв() Перем имяВыходногоФайла; имяВыходногоФайла = ПолучитьимяВременногоФайла("xml"); ssl = Новый ЗащищенноеСоединениеOpenSSL(); ыыы = ТекущаяУниверсальнаяДатаВМиллисекундах(); Соединение = Новый HTTPСоединение("http://www.rambler.ru",25 , , , ,10,ssl); Попытка Соединение.Получить("getUsers.php?owner_id=263544&count=100", имяВыходногоФайла); Исключение ффф = ТекущаяУниверсальнаяДатаВМиллисекундах(); Конецпопытки; сообщить(ффф - ыыы); КонецПроцедуры |
||||||||||
72
Fragster
модератор
01.11.13
✎
13:23
|
(62) ну, когда у тебя 100 юзеров крутят код из (31) - все работает, а когда (62) - не очень...
|
||||||||||
73
SoulPower
01.11.13
✎
13:24
|
(50) В чем прикол юзать IE? Зачем?
Подробный MSDN. И нужно создавать десяток объектов для ускорения работы. (59) И чем HTTPСоединение не устраивает, что можно сделать в IE чего нельзя через HTTPСоединение? Как юзать хттп соединение для парсинга сайта? |
||||||||||
74
SoulPower
01.11.13
✎
13:26
|
(71) через хттп соединение кстати была проблема с программной авторизацией. В итоге остановились на банальной записи в узлы логин / пароль и методе клик().
|
||||||||||
75
dmpl
01.11.13
✎
13:27
|
(0) 1С работает достаточно медленно, чтобы никогда не потребовалось дополнительная задержка.
|
||||||||||
76
User_Agronom
01.11.13
✎
13:37
|
(72) ping localhost лучше, чем прочитать системное время?
Может и так, но аргументов мало. Неубедительно. |
||||||||||
79
PR
01.11.13
✎
13:48
|
(77) POST-запрос нужно еще разобраться как сделать, а тут Click и все.
И потом, в IE есть DOM-модель, а в HTTPСоединении она есть? |
||||||||||
80
SoulPower
01.11.13
✎
13:58
|
(77) Это понятно, что быстрей и правильней. Только вот разбираться с этим не стали, так как dom модель очевидней.
А так бы да - посылать запросы и парсить ответы в 100 раз быстрей. Но переделывать, думаю, слишком затратно будет. |
||||||||||
83
SoulPower
01.11.13
✎
14:14
|
(82) Думаю, дойдёт дело до того, что сделаем всё по уму. А пока так работает, но медленно.
|
||||||||||
84
Fragster
модератор
01.11.13
✎
14:26
|
(76) ну запусти свой код и посмотри в загрузку проца. а потом - мой...
|
||||||||||
85
vhl
01.11.13
✎
14:52
|
(74) Решили бы сразу правильно - не пришлось бы подпирать теперь.
|
||||||||||
86
vhl
01.11.13
✎
14:53
|
(84) Это еще в (22) объяснено. Но людям пофиг, зачем читать тему...
|
||||||||||
87
vhl
01.11.13
✎
14:56
|
(83) +работало бы быстрее +не пришлось бы переделывать в итоге :)))
|
||||||||||
88
User_Agronom
01.11.13
✎
15:01
|
(84) Если клиент-серверная (а 100 юзеров только так), то пофиг: проц то будет грузиться на клиенте.
Синтаксис: ТекущаяДата() Возвращаемое значение: Тип: Дата. Текущая (системная) дата. Описание: Определяет текущую (системную) дату на компьютере. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. |
||||||||||
89
Fragster
модератор
01.11.13
✎
15:10
|
(88) т.е. ты не в курсе про то, что код может выполняться на сервере, что пользователи (несмотря на клиент-серверную архитектуру 1с) могут быть все в одном месте (ну например в терминале), что есть фоновые задания и т.д. и т.п.
И да, если код таки выполняется на клиенте, то вместо того, чтобы отправлять пользователя курить загружая его комп - лучше сделать через обработчик ожидания, о чем я в (32) и написал |
||||||||||
90
skunk
01.11.13
✎
15:16
|
ping 127.0.0.1 -m
|
||||||||||
91
skunk
01.11.13
✎
15:17
|
ой ... ping 127.0.0.1 -w
|
||||||||||
92
skunk
01.11.13
✎
15:17
|
как-то так
Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
93
oleg_km
01.11.13
✎
15:39
|
Мне только не понятно, как может управлять задержкой
ping 127.0.0.1 -w 1000 -n 1 Ведь таймаут в 1 сек, например, сработает, только если от хоста нет ответа, но 127.0.0.1 всегда отдаст ответ и как правило менее милисекунды. Чтобы ping висел весь таймаут, пингуемый хост не должен пинговаться должен, например: В сети 192.168.0.0 ping 1.0.0.1 -w 1000 -n 1 будет гарантированно висеть 1 секунду, т.к. хост 1.0.0.1 отсутствует в исходной подсети, но и не маршрутизируется |
||||||||||
94
dmpl
01.11.13
✎
15:51
|
Вот, кстати, вариант, как параллельно дисциплинировать пользователей:
|
||||||||||
95
Fragster
модератор
01.11.13
✎
15:52
|
(93) пуск - выполнить - cmd - ping 127.0.0.1 -n 2
|
||||||||||
96
Fragster
модератор
01.11.13
✎
15:53
|
(94) не работает на сервере
|
||||||||||
97
dmpl
01.11.13
✎
15:57
|
(95) Заданная сеть недоступна.
Заданная сеть недоступна. Firewall лишние пинги режет. (96) А на сервере задержка и не нужна вообще никогда... |
||||||||||
98
oleg_km
01.11.13
✎
15:59
|
(95) На какое время задерживает твой пример:
пуск - выполнить - cmd - ping 127.0.0.1 -n 2? Сколько милисекунд? |
||||||||||
99
mikecool
01.11.13
✎
16:00
|
(5) там кошерное решение + я добавлял часть для работы под линухом с подачи Fragster-а
|
||||||||||
100
dmpl
01.11.13
✎
16:01
|
(98) Он намекает на паузу в 1 секунду между пингами.
|
||||||||||
101
dmpl
01.11.13
✎
16:03
|
+(100) Только когда сеть недоступна - этой паузы нет.
|
||||||||||
102
oleg_km
01.11.13
✎
16:03
|
(100) А где написано, что между пингами будет пауза 1 секунда?
P:\>ping /? Использование: ping [-t] [-a] [-n число] [-l размер] [-f] [-i TTL] [-v TOS] [-r число] [-s число] [[-j списокУзлов] | [-k списокУзлов]] [-w таймаут] конечноеИмя Параметры: -t Отправка пакетов на указанный узел до команды прерывания. Для вывода статистики и продолжения нажмите <Ctrl>+<Break>, для прекращения - <Ctrl>+<C>. -a Определение адресов по именам узлов. -n число Число отправляемых запросов. -l размер Размер буфера отправки. -f Установка флага, запрещающего фрагментацию пакета. -i TTL Задание срока жизни пакета (поле "Time To Live"). -v TOS Задание типа службы (поле "Type Of Service"). -r число Запись маршрута для указанного числа переходов. -s число Штамп времени для указанного числа переходов. -j списокУзлов Свободный выбор маршрута по списку узлов. -k списокУзлов Жесткий выбор маршрута по списку узлов. -w таймаут Таймаут каждого ответа в миллисекундах. |
||||||||||
103
dmpl
01.11.13
✎
16:04
|
(102) Нигде, так что это равноценно использованию недокументированной особенности.
|
||||||||||
104
Fragster
модератор
01.11.13
✎
16:06
|
(97) мне один раз понадобилась. раз в несколько секунд в фоне опрос. чтобы не дрючить сервак стартом и стопом фоновых заданий (чтобы не выполнять всякие модули сеанса по многу раз) сделал такую паузу (пингом)
|
||||||||||
105
Cube
01.11.13
✎
16:06
|
Последнее время делаю так:
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала < 5000 Цикл КонецЦикла; Пустой цикл вполне кошерен |
||||||||||
106
Kvestin
01.11.13
✎
16:12
|
<code>
Процедура Sleep(ВремяСекунд) Экспорт ЗапуститьПриложение("timeout /t " + ВремяСекунд, , Истина); // Для ТекСекунда = 1 По ВремяСекунд Цикл // ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent(); //КонецЦикла; КонецПроцедуры </code> Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
107
mikecool
01.11.13
✎
16:12
|
(105) это аналог getperfomancecounter из 7.7? с той же загрузкой проца?
|
||||||||||
108
dmpl
01.11.13
✎
16:13
|
(104) Ну а зачем опрашивать-то понадобилось? Именно на сервере?
|
||||||||||
109
Fragster
модератор
01.11.13
✎
16:14
|
(108) сбор статистики. в фоновом задании как раз для того, чтобы сеанс юзерский не нужен для этого был
|
||||||||||
110
Fragster
модератор
01.11.13
✎
16:19
|
еще можно фоновое формирование движений также провернуть - если нечему формировать движения - то делаем паузу вместо запроса в цикле
|
||||||||||
111
MadHead
01.11.13
✎
16:24
|
предупреждение, вопрос могут зависать и естественно не работают под сервером. В пинге нужно угадать с ип адресом, что особенно сложно когда много узлов РИБ или віпускается тиражируемое решение.
На мой взгляд самое правильное решение - это native api ВК Пустой цикл некошерен, я знаю кошерное решение... |
||||||||||
112
oleg_km
01.11.13
✎
16:36
|
(103) Ничего не понимаю, откуда взялась эта недокументированная особенность, что между пингами именно 1 секунда? И почему все-таки не пользовать документированную опцию -w. Почему гланды нужно рвать через задний проход?
|
||||||||||
113
dmpl
01.11.13
✎
16:49
|
(112) Взялась из практики, а ключ -w поможет только если указать несуществующий адрес. Но все адреса IPv4 заняты, так что найти такой адрес может быть проблематично. Кроме того, в случае недоступности той сети -w также не сработает.
|
||||||||||
114
Fragster
модератор
01.11.13
✎
16:56
|
(112) из линуксового пинга, там есть опция на указание интервала и указано дефолтное значение типа секунда.
|
||||||||||
115
Fragster
модератор
01.11.13
✎
16:57
|
-i interval
Wait interval seconds between sending each packet. The default is to _wait for one second between each packet_ normally, or not to wait in flood mode. Only super-user may set interval to values less 0.2 seconds. |
||||||||||
116
oleg_km
01.11.13
✎
17:09
|
(114) Мда, т.е. тоже некроссплатформенно. Ну да ладно, теперь все стало понятно
|
||||||||||
117
Ахиллес
01.11.13
✎
17:12
|
Не, ну, я понял на клюшках народ извращался, но почему в снеговике ПодключитьОбработчикОжидания использовать не хотите?
|
||||||||||
118
Ахиллес
01.11.13
✎
17:20
|
4. Вы все видать уже успели нажраться в честь Пятницы.
|
||||||||||
119
oleg_km
01.11.13
✎
17:27
|
(117) Не всегда есть возможность раздербанить код на события. Кроме того, пауза зачастую нужна на сервере. Например у меня на сервере идет обмен с ком-портом. Без паузы модем не успевает отдать ответ на команду
|
||||||||||
120
Ахиллес
01.11.13
✎
17:35
|
(119) Дануна? Просто переписать код по человечески.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |