Имя: Пароль:
1C
 
как сделать паузу в цикле?
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

чисСекунд = 120;
командасистемы("ping -n " + чисСекунд + " 127.0.0.1 > NUL");
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

чисКонец = ТекущееВремя() + 120;
пока ТекущееВремя() < чисКонец цикл
конеццикла;
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)вот не надо тут гадать что да как-бы ... человек ясно спросил


цикл х = 1 по ЧемуТо цикл
  ...
  ...
  ...
  ЗдесьЗадержка(НужноеВремяВСекундах); // как?
конеццикла;
45 AquaKosh
 
06.08.10
12:46
Да! Давайте положим сервак 1С бесконечным циклом без отдачи времени операционной системе! А что, пофигу, сейчас серваки мощные! :))
46 skunk
 
06.08.10
12:47
поэтому без всяких слипов и циклов в цикле


чисСекунд = 120;
цикл х = 1 по ЧемуТо цикл
  ...
  ...
  ...
  командасистемы("ping -n " + чисСекунд + " 127.0.0.1 > NUL");
конеццикла;
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 ура