![]() |
![]() |
![]() |
|
как сделать паузу в цикле? | ☑ | ||
---|---|---|---|---|
0
Сергиус
06.08.10
✎
11:14
|
Чтобы после каждой итерации цикла была задержка допустим на 2 минуты.
|
|||
1
butterbean
06.08.10
✎
11:15
|
например Предупреждение()
|
|||
2
Сергиус
06.08.10
✎
11:16
|
(1) а если допустим на Сервере это нужно?
|
|||
3
Сергиус
06.08.10
✎
11:17
|
+2 нет ли какой штатной функции задержки?
|
|||
4
rotting
06.08.10
✎
11:19
|
(3) Штатной нет, можно использовать функции ТекущаяДата() написать маленький алгоритм паузы.
|
|||
5
Rie
06.08.10
✎
11:19
|
Shell = Новый COMОбъект("WScript.Shell");
Пока НеНадоело Цикл Shell.Sleep(120000); КонецЦикла; |
|||
6
AquaKosh
06.08.10
✎
11:19
|
(0) Если нужно отдавать таймслайсы, то можно юзать ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
|
|||
7
Сергиус
06.08.10
✎
11:34
|
(5) пишет что метод Sleep не обнаружен..
|
|||
8
Лефмихалыч
06.08.10
✎
11:37
|
||||
9
Лефмихалыч
06.08.10
✎
11:38
|
(5) нет у шелла такого метода, это метод объекта WScript, котрый создается ТОЛЬКО программами wscript.exe и cscript.exe
(7) потому и не кусаютъ (с) |
|||
10
Сергиус
06.08.10
✎
11:41
|
(9) спасиб, я понял..
|
|||
11
skunk
06.08.10
✎
11:48
|
командасистемы("ping -n " + чисСекунд + " 127.0.0.1 > NUL")
|
|||
12
skunk
06.08.10
✎
11:49
|
|
|||
13
AquaKosh
06.08.10
✎
11:51
|
Мда... Вот мне интересно, извращения с пинг и Предупреждение - это дань моде? Вариант (6) отметается по религиозным соображениям? ... :)
|
|||
14
skunk
06.08.10
✎
11:54
|
(13)выучил новое слово решил рисануться а никто даже внимания не обратил?
|
|||
15
AquaKosh
06.08.10
✎
11:56
|
(14) Ты не прав. Я сам прошёл через эти пинги, генерацию файла со скриптом на лету и т.п.
|
|||
16
anddro
06.08.10
✎
11:58
|
(6)(14) Спасибо, очень интересная тема.
Поиском вышел на статью откуда можно понять, как это работает: http://www.samag.ru/cgi-bin/go.pl?q=articles;n=03.2006;a=05 |
|||
17
Лефмихалыч
06.08.10
✎
12:08
|
с предупреждением весело становится, когда код ВНЕЗАПНО начинает выполняться на сервере. Ни чего, кроме желания насадить автора на кол, такие штуки не вызывают.
|
|||
18
Jolly Roger
06.08.10
✎
12:12
|
(6) если не затруднит, примерчик использования, пожалста
|
|||
19
Андрюха
06.08.10
✎
12:14
|
(6) Просим, просим!
|
|||
20
vde69
06.08.10
✎
12:16
|
регламентная обработка не подходит? вот пример как делается вызов обработки с контролем от паралельного запуска
Функция ВыполнитьОбработку(Ссылка, Авто=Истина) Экспорт Результат = Истина; ИмяОбъекта = "Регламент."+ СокрЛП(Ссылка.ИмяОбработки); ОписаниеОшибки = ""; СтатусВыполненияОбработки = Неопределено; Попытка Объект = Ссылка.ПолучитьОбъект(); Исключение Результат = Ложь; ОписаниеОшибки = "[" + ИмяОбъекта + "]" + ОписаниеОшибки(); Объект = Неопределено; КонецПопытки; Если Объект <> Неопределено Тогда Попытка Объект.Заблокировать(); Обработка = Обработки[СокрЛП(Ссылка.ИмяОбработки)].Создать(); Обработка.Авто_Регламент = Истина; МетаданныеОбработки = Обработка.Метаданные(); Для Каждого Стр Из Ссылка.ПараметрыОбработки Цикл ИмяРеквизита = Стр.ИмяПараметра; Если ИмяРеквизита = "Авто_Регламент" Тогда Продолжить; КонецЕсли; Если ПроведениеДокументов.ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеОбработки) Тогда Если Найти(ВРЕГ(ИмяРеквизита),"ПАРОЛЬ")>0 Тогда Обработка[ИмяРеквизита] = Стр.ЗначениеПароля; Иначе Обработка[ИмяРеквизита] = Стр.ЗначениеПараметра; КонецЕсли; КонецЕсли; КонецЦикла; СтатусВыполненияОбработки = Обработка.ВыполнитьОбработку(); Исключение Результат = Ложь; ОписаниеОшибки = "[" + ИмяОбъекта + "]" + ОписаниеОшибки(); КонецПопытки; Если Объект.Заблокирован() Тогда Объект.Разблокировать(); КонецЕсли; КонецЕсли; Если СтатусВыполненияОбработки <> Истина Тогда Если ОписаниеОшибки = "" Тогда ОписаниеОшибки = СтатусВыполненияОбработки; КонецЕсли; Результат = Ложь; КонецЕсли; // теперь попробуем записать статусы в регистр Попытка Лог = РегистрыСведений.ЛогРегламентыхЗаданий.СоздатьМенеджерЗаписи(); Лог.Обработка = Ссылка; Лог.АвтоЗагрузка = Авто; Лог.Дата = ТекущаяДата(); Лог.СтатусЗавершения = Результат; Лог.ОписаниеОшибки = ОписаниеОшибки; Лог.Записать(Истина); Исключение ОписаниеОшибки2 = "[" + ИмяОбъекта + "]" + ": ошибка регистрации исполнения """ + ОписаниеОшибки() + """"; #Если Клиент Тогда Сообщить(ОписаниеОшибки2); #КонецЕсли ЗаписьЖурналаРегистрации(ИмяОбъекта, УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки2, РежимТранзакцииЗаписиЖурналаРегистрации.Независимая); КонецПопытки; #Если Клиент Тогда Если не Результат Тогда Сообщить("Обработка не выполнена. """+ ОписаниеОшибки +""""); КонецЕсли; #КонецЕсли Возврат Результат; КонецФункции |
|||
21
skunk
06.08.10
✎
12:17
|
(15)в чем неправ ... что-бы сделать двухминутную задержку ты создаешь олешный объект ... на который уже тратиться время
|
|||
22
skunk
06.08.10
✎
12:18
|
(20)а это то зачем?
|
|||
23
Расколбас
06.08.10
✎
12:18
|
Речь о клюшках или о снеговике? Со слипами и пингами народ в семерке извращался, а в восьмерке ПодключитьОбработчикОжидания(<Имя процедуры>, <Интервал>, <Однократно>) чудненько работает.
|
|||
24
vde69
06.08.10
✎
12:20
|
(22) тело цикла пишешь в обработку и регламентом вызываешь 1 раз в 2 минуты, по моему это именно то чего хочет автор
|
|||
25
vde69
06.08.10
✎
12:21
|
(23) ты не прав ПодключитьОбработчикОжидания - работает совсем не чудно :)
|
|||
26
Расколбас
06.08.10
✎
12:23
|
(25) Ы?
Когда при работе с сайтом из 1с мне потребовалось в код вставить 10 секундную задержку, я её реализовал с помощью ПодключитьОбработчикОжидания. |
|||
27
skunk
06.08.10
✎
12:24
|
(24)мда ... я быстрее за (6) соглашусь
|
|||
28
AndreyFAN
06.08.10
✎
12:24
|
(25) хм... а чем не чудненько? у меня несколько раз в конфе это используется...
вроде работает... поделись, плиз, подводными камнями... что там? |
|||
29
Сергиус
06.08.10
✎
12:26
|
(28) недоступно на Сервере..
|
|||
30
AndreyFAN
06.08.10
✎
12:27
|
(29) спс. у меня файловая. ок.
|
|||
31
vde69
06.08.10
✎
12:27
|
(26)(28) проверьте время через какое срабатывает обработчик при свободной и загруженой системе
|
|||
32
AndreyFAN
06.08.10
✎
12:28
|
(31) не думаю что погрешность настолько критична
|
|||
33
vde69
06.08.10
✎
12:28
|
(27) мы не знаем задачу автора, если это автоматизация робота, то рег задание имено для этого и придумано :)
|
|||
34
vde69
06.08.10
✎
12:29
|
(32) как сказать, например для шахмат, где таймер нужен - это критично
|
|||
35
Сергиус
06.08.10
✎
12:29
|
(33) задача простая, сделать задержку в цикле)
|
|||
36
Расколбас
06.08.10
✎
12:31
|
(34) Понял, спасибо. Значит ПодключитьОбработчикОжидания можно использовать только на клиенте или в файловой и когда нужно просто "немножко подождать". Имхо для большинства задач вполне подходит.
|
|||
37
AndreyFAN
06.08.10
✎
12:31
|
(33) "1с для шахмат" :-)))) а спутники 1с ещё не запускает?
(31) при Перегруженной системе думаю и Регламентные задания также зависнут как и ОбработчикОжидания |
|||
38
AquaKosh
06.08.10
✎
12:35
|
Ух ты сколько наколбасили! Сейчас опять 100 постов обсуждения будет! :))
Кто-то просил пример на базе (6)... вот рыба: Попытка COMTime = ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'"); Исключение // Возврат; КонецПопытки; // Время в сек. Пока Время > 0 Цикл Попытка COMTime.NextEvent(); Исключение // Прервать; КонецПопытки; Время = Время - 1; КонецЦикла; |
|||
39
Jolly Roger
06.08.10
✎
12:40
|
(38) Метод объекта не обнаружен (NextEvent)
|
|||
40
coding
06.08.10
✎
12:43
|
(0) А не пробовал сделать с это с обработкой ожидания?
|
|||
41
skunk
06.08.10
✎
12:43
|
|
|||
42
1C-Nick
06.08.10
✎
12:44
|
(41) ага
ВремяЗадержкиСек = 120; ТекВремя = ТекущаяДата(); НужноеВремя = ТекВремя + ВремяЗадержкиСек; Пока ТекущаяДата() < НужноеВремя Цикл ОбработкаПрерыванияПользователя(); КонецЦикла; просто для коллекции |
|||
43
1C-Nick
06.08.10
✎
12:44
|
но использовать в реальных задачах не советую
|
|||
44
skunk
06.08.10
✎
12:45
|
(33)вот не надо тут гадать что да как-бы ... человек ясно спросил
|
|||
45
AquaKosh
06.08.10
✎
12:46
|
Да! Давайте положим сервак 1С бесконечным циклом без отдачи времени операционной системе! А что, пофигу, сейчас серваки мощные! :))
|
|||
46
skunk
06.08.10
✎
12:47
|
поэтому без всяких слипов и циклов в цикле
|
|||
47
1C-Nick
06.08.10
✎
12:47
|
как по мне, то вариантов уже на любой вкус и цвет.
(45) да, а еще чтобы запустилось от 20 клиентских подключений на сервере. да и к тому же, а вдруг надо имитировать бурную деятельность... |
|||
48
Jolly Roger
06.08.10
✎
12:49
|
(45) глянь (39)
|
|||
49
skunk
06.08.10
✎
12:50
|
(45)где тут за бесконечность?
|
|||
50
1C-Nick
06.08.10
✎
12:55
|
(46) если бы еще окно не вылазило...
|
|||
51
AquaKosh
06.08.10
✎
12:59
|
(48) Хм... у меня всё ок.
(45) Это я образно для поддержания ветки. Имел ввиду любые циклы без отдачи времени операционке. |
|||
52
skunk
06.08.10
✎
13:01
|
(50)можно сделать что-бы и не вылазило
|
|||
53
1C-Nick
06.08.10
✎
13:20
|
(52) что-то типа
Сообщить(ТекущаяДата()); чисСекунд = 10; WshShell = Новый COMОбъект("WScript.Shell"); oExec=WshShell.Run("cmd.exe /c ping -n " + чисСекунд + " 127.0.0.1 > NUL", 0, 1); Сообщить(ТекущаяДата()); |
|||
54
1C-Nick
06.08.10
✎
13:26
|
Есть еще rundll32 kernel32.dll Sleep 10, но у меня так и не получилось заставить сие чудо работать столько сколько нужно
|
|||
55
skunk
06.08.10
✎
13:31
|
WshShell = Новый COMОбъект("WScript.Shell");
Сообщить(ТекущаяДата()); чисСекунд = 10; WshShell.Run("cmd.exe /c ping -n " + чисСекунд + " 127.0.0.1 > NUL", 0, 1); Сообщить(ТекущаяДата()); |
|||
56
1C-Nick
06.08.10
✎
13:31
|
(55) ))
|
|||
57
Jolly Roger
06.08.10
✎
13:55
|
(51) ты на какой оси проверяешь? у меня хр сп2
|
|||
58
skunk
06.08.10
✎
14:08
|
(56)просто так точнее ...
|
|||
59
Рэйв
06.08.10
✎
14:14
|
А может проще
//----------- Тек=ТекущаяДата(); Пока ТекущаяДата()-Тек <10 Цикл КонецЦикла; |
|||
60
skunk
06.08.10
✎
14:16
|
(59)тогда смотри (41)
|
|||
61
Рэйв
06.08.10
✎
14:23
|
(60)Ну да аналогично:)
|
|||
62
AquaKosh
06.08.10
✎
14:33
|
(57) Клиент XP SP3, сервак 2003 SP2 - везде ок.
|
|||
63
skunk
06.08.10
✎
15:32
|
(62)ну скажи чем этот выверт отличается от кода в (41) ... только тем, что используется вми
|
|||
64
1C-Nick
06.08.10
✎
15:35
|
давайте голосовать какой вариант лучше )
|
|||
65
AquaKosh
06.08.10
✎
15:35
|
(63) 41? ... В (41) 100% загрузка проца. Не так?
|
|||
66
1C-Nick
06.08.10
✎
15:36
|
кстати топикстартер как-то исчез - видимо нашел для себя решение
(65) так, 100% загрузка 1 ядра/1 проца |
|||
67
AquaKosh
06.08.10
✎
15:36
|
Эх, не дотянем до сотни... :(
|
|||
68
AquaKosh
06.08.10
✎
15:46
|
(66) Ладно, 1 ядра/1 проца... А если работа через терминал на сервере и задержки буду использоваться многими пользователями - работа встанет. :)
|
|||
69
1C-Nick
06.08.10
✎
15:59
|
(68) именно поэтому (43)
|
|||
70
AquaKosh
06.08.10
✎
16:10
|
70! ... Однако я ожидал большего наплыва страстей. :) Видать тем, кто давно на форуме подобные темы уже настолько надоели, что они даже и не ввязываются...
|
|||
71
Jolly Roger
06.08.10
✎
16:15
|
(62) да, на сервере проверил - работает, а на хр, похоже, требуется третий пак.
вобщем, зачетный способ. спасибо тебе! |
|||
72
1C-Nick
06.08.10
✎
16:17
|
кто поборет вот это:
rundll32 kernel32.dll Sleep 120 на VB отрабатывает если объявлять импортируемую процедуру... |
|||
73
MaSSSter
06.08.10
✎
16:46
|
(0)
ПодключитьОбработчикОжидания(<Имя процедуры>, <Интервал>, <Однократно>) сойдет? Вариант 2: сделать процедуру задержки, в которой в цикле проверяется время, и при превышении необходимого цикл прерывается |
|||
74
AquaKosh
06.08.10
✎
16:49
|
(73) О, свежая кровь! :) Пожалуйста по-подробнее по варианту №2...
|
|||
75
vde69
06.08.10
✎
16:55
|
зацените:
Тек=ТекущаяДата(); Пока ТекущаяДата()-Тек <10 Цикл Сигнал(); КонецЦикла; |
|||
76
MaSSSter
06.08.10
✎
16:57
|
(74)
Процедура Задержка(НачДата, ЗадержкавСекундах) Пока ТекущаяДата() < НачДата + ЗадержкавСекундах Цикл КонецЦикла КонецПроцедуры |
|||
77
MaSSSter
06.08.10
✎
16:59
|
Да в (59) уже было наподобие
|
|||
78
Kashemir
06.08.10
✎
17:01
|
(71) + 1, хорошая вещь в (6). Только не могу понять почему не пашет WQL конструкция WITHIN при том же запросе
|
|||
79
YV
06.08.10
✎
17:02
|
Для Счетчик = 1 По 10000 Цикл
// Здесь что-то делаем // Организация паузы 120 секунд ЗадержкаДо = ТекущаяДата() + 120; Пока ЗадержкаДо >= ТекущаяДата() Цикл // Здесь ничего не делаем КонецЦикла; КонецЦикла; |
|||
80
Kashemir
06.08.10
✎
17:06
|
(79) Отличный способ занять ядро процессора на 100%.
|
|||
81
1C-Nick
06.08.10
✎
17:14
|
*как все любят читать что написано в предыдущих постах. жуть, аж страшно
|
|||
82
sash-ml
06.08.10
✎
17:15
|
может и дойдем до 100 если постараемся
|
|||
83
1C-Nick
06.08.10
✎
17:18
|
хорошо бы если бы посты были с новыми алгоритмами задержек, а так воды много в 100 постах, а полезной информации не больше 10
|
|||
84
Eugene_life
06.08.10
✎
17:28
|
Сделать через простую математическую операцию предлагали?
Типа: Н = 0; Пока Н < 10000000 Цикл Н = Н +1; КонецЦикла; |
|||
85
1C-Nick
06.08.10
✎
17:50
|
(84) а кто знает сколько будет выполняться такой цикл на разных машинах с разными процессорами?
|
|||
86
NS
06.08.10
✎
17:53
|
(84) 100% нагрузка на одно ядро. Нормальные люди так паузы не делают.
|
|||
87
Sabbath
06.08.10
✎
18:23
|
(86) Так вопрос как сделать паузу, а не как сделать это нормально))
|
|||
88
AquaKosh
06.08.10
✎
18:27
|
(87) Точно! Грузить 1 ядро мы уже умеем, теперь надо придумать, как грузить все сразу + самым извращённым способом! ]:->
|
|||
89
vmv
06.08.10
✎
18:27
|
(87)пауза и колабз вещи разные
|
|||
90
AquaKosh
06.08.10
✎
18:43
|
90! Осталось совсем чуть-чуть до сотни...
|
|||
91
sash-ml
06.08.10
✎
19:04
|
91 все равно дойдем до 100
КонецМесячных = ТекущаяДата() + 1200/10; Пока КонецМесячных >= ТекущаяДата() Цикл а=1; КонецЦикла; |
|||
92
1C-Nick
06.08.10
✎
19:06
|
(91) не
НачалоМесячных = ТекущаяДата(); КонецМесячных = НачалоМесячных + 3*40; |
|||
93
sash-ml
06.08.10
✎
19:14
|
(92) не
НачалоМесячных = ТекущаяДата(); КонецМесячных = НачалоМесячных + Sqrt(1522756)-34 ; |
|||
94
Рэйв
06.08.10
✎
19:41
|
(91)Вечный цикл
|
|||
95
Рэйв
06.08.10
✎
19:44
|
хотя нет:) ошибся, не вечный:)
|
|||
96
sash-ml
07.08.10
✎
11:42
|
(94) конечно не вечный :)
|
|||
97
Klesk
07.08.10
✎
12:28
|
(0) забеременеть :)
|
|||
98
1C-Nick
09.08.10
✎
10:26
|
(98) интересно, а сам на себя сослаться можно?..
|
|||
99
smaharbA
09.08.10
✎
10:29
|
слип из вскрипта можно получить в адинесе
|
|||
100
sash-ml
09.08.10
✎
11:45
|
100 ура
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |