Имя: Пароль:
1C
 
Аналог Sleep()
,
0 Lenny
 
22.02.07
09:31
Подскажите,братцы,если аналог апишной Sleep() в восьмерке,
циклы не предлагать.Спасибо заранее.
1 coder1cv8
 
22.02.07
09:32
Предупреждение()?
2 coder1cv8
 
22.02.07
09:33
(0) а что тебе мешает Sleep() использовать?
3 Lenny
 
22.02.07
09:34
Нет,не подходит,диалог появиться на экране я думаю
4 coder1cv8
 
22.02.07
09:36
(3) а по поводу (2)?
5 Lenny
 
22.02.07
09:40
А как я могу Sleep() использовать?
6 coder1cv8
 
22.02.07
09:41
выполнить скрипт внутри эски, например...
7 coder1cv8
 
22.02.07
09:43
8 Lenny
 
22.02.07
09:47
Спасибо,сейчас почитаю
9 Gepard
 
22.02.07
09:49
http://d01-soft.ru/soft-vk1c.htm

Правда с восьмеркой не пробовал
10 smaharbA
 
22.02.07
09:52
с шагом в 1 сек всего 1 строка кода, ну если черенькие окошки раздрожают то 2 строки
11 smaharbA
 
22.02.07
10:02
Выбирай по вкусу

Шел=СоздатьОбъект("WScript.Shell");
Шел.run("ping -n 1 -w 2000 0.0.0.1",0,-1);
Шел.run("timeout /t 2",0,-1);
Шел.run("choice /t 2 /d y",0,-1);

и еще - есть способ получить объект WScript во всей своей кросе в адинеску..
есть еще метод - 3 строки, но шаг тоже 1 сек
12 coder1cv8
 
22.02.07
10:07
(11) Вот по поводу WScript во всей красе, расскажи по-подробней, плиз.
13 Звездочёт
 
22.02.07
11:38
(11) С командой ping клёво придумано :)
А вот остальные:
C:\Documents and Settings\ivan>timeout /?
"timeout" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
То же и для choice...
14 romix
 
22.02.07
11:41
15 romix
 
22.02.07
11:49
(7) sleep что-то не получается замутить...
16 Звездочёт
 
22.02.07
11:58
(15) конечно не получится.
Т.к. в MSScriptControl нет объекта WScript (контекста WSH).
17 romix
 
22.02.07
12:03
18 Звездочёт
 
22.02.07
12:08
(17) можно и так сказать :) т.е. методом Sleep воспользоваться не удастся.
19 Звездочёт
 
22.02.07
12:10
(17) знаешь, чем Предупреждение плохо использовать в качестве паузы? :)
20 romix
 
22.02.07
12:11
(19) Да, там че-то не срабатывает когда окно свернуто...
21 Звездочёт
 
22.02.07
12:14
(20) именно. Точнее, когда окно фокус теряет.
То же самое, для диалога ВводЧисла.
А вот для ВводСтроки - таймаут работает! ;))
22 Лойфер
 
27.03.07
14:03
Так есть способ заSleepаться без внешних файлов и компонент? Неужели через COM нельзя совсем? Мне вот конкретно надо ставить задержку в цикле. Видел способ (Книга знаний: Перепроведение документов в 1С:Предприятие без блокировки других пользователей), где создается файл-скрипт и он запускается. Но мне он совсем не нравится.
23 tsr
 
27.03.07
14:12
Я такую процедурку замутил, ибо нужно было именно так
Процедура Sleep(сек) Экспорт
   нач=ТекущаяДата();
   Пока ТекущаяДата() - нач < сек Цикл
   КонецЦикла;    
КонецПроцедуры
24 Лойфер
 
27.03.07
14:15
Да вродь неплохо, но, боюсь, это процессор займет аж на 100%. А у меня программа на серваке работает - не есть гут...
25 tsr
 
27.03.07
14:17
Я юзаю для определенных случаев. Например, при массовом перепроведении документов. Чтобы другие юзеры могли работать. Процедура запускается на клиенте и никак на производительность сервера не влияет
26 coder1cv8
 
27.03.07
14:18
(16) хм... а я не знал, извиняюсь...
27 Лойфер
 
27.03.07
14:20
(26) и это печально :(
28 smaharbA
 
27.03.07
14:28
Sleep довольно просто получается замутить, причем именно тот который в WScript
29 Михаил Козлов
 
27.03.07
14:31
Может быть так:
ПРОЦЕДУРА Sleep() ЭКСПОРТ
 ОтключитьОбработчикОжидания(Sleep);
КОНЕЦПРОЦЕДУРЫ
Там где надо:
ПодключитьОбработчикОжидания(Sleep, 5);
30 Лефмихалыч
 
27.03.07
14:32
(0) Книга знаний: Перепроведение документов в 1С:Предприятие без блокировки других пользователей
в самом конце процедурка, которая WScript.Sleep() для нужд 1С используется
31 smaharbA
 
27.03.07
14:34
(30) можно гораздо интереснее, сам WScript в 1С задействовать...
(29) блин, ниче не понимаю, ноль в восьмерке полнейший ((
32 Лефмихалыч
 
27.03.07
14:38
(31) =o как? Объект WScript же создается программами wscript.exe & cscript.exe
33 smaharbA
 
27.03.07
14:44
(32) вот в том и беда, но всеравно его можно выдрать, как гланды через одно место ))
...

//*******************************************
Процедура Сформировать()
   ИЕ=СоздатьОбъект("internetexplorer.application");
   ИЕ.navigate("about:blank");
   Пока ИЕ.ReadyState<4 Цикл
       Состояние("Ждем...");
   КонецЦикла;
   Док=ИЕ.document;
   Заголовок=_GetPerformanceCounter();
   Файл=КаталогВременныхФайлов()+Заголовок+".js";
   Док.write("<title>"+Заголовок+"</title><body><val id=wscript value=0 /></body>");
   Текст=СоздатьОбъект("Текст");
   Текст.ДобавитьСтроку("shell=new ActiveXObject('shell.application');
   |e=new Enumerator(shell.Windows());
   |for (;!e.atEnd();e.moveNext()){
   |    if (e.item().document) {
   |        if (e.item().document.title=='"+Заголовок+"') {
   |            e.item().document.all.wscript.value=WScript;
   |            while(true){WScript.Sleep(1000)};
   |            }
   |        }
   |    }");
   Текст.Записать(Файл);
   ЗапуститьПриложение("wscript.exe """+Файл+"""");
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="javascript";
   Нач=_GetPerformanceCounter();
   Пока 1=1 Цикл
       Попытка
           ВСкрипт=Док.all.wscript.value;//ВОТОН НАШ WScript!!!
           Состояние(ВСкрипт.FullName);
           Прервать;
       Исключение
           Если _GetPerformanceCounter()-Нач>=10000 Тогда
               Сообщить("Нифига не вышло","!!!");
               Возврат;
           КонецЕсли;
           Состояние("Ждем...");
       КонецПопытки
   КонецЦикла;
   Задержка=1111;
   Сообщить("Проверим задержку, задано - "+Задержка);
   Нач=_GetPerformanceCounter();
   ВСкрипт.Sleep(Задержка);
   Вр=_GetPerformanceCounter()-Нач;
   ВСкрипт.Echo("Задержка - "+Вр+" мсек.","Проверочка окна WScript.Echo");
   Док.all.wscript.value.Quit();
   ФС.УдалитьФайл(Файл);
   ИЕ.Quit();
КонецПроцедуры
34 smaharbA
 
27.03.07
14:46
Понятно, что это запускать в начале конфы, а после только проверять наличие WScript
35 ХорошийПарень
 
27.03.07
15:11
(29)+1
Или так:

Модуль приложения:

//***********************************************************************
Перем НачалоСчета Экспорт;
Перем КонецСчета Экспорт;

Процедура ИмяПроцедурыМодуляПриложения()Экспорт
   ОтключитьОбработчикОжидания("ИмяПроцедурыМодуляПриложения");
   Пока не НачалоСчета=КонецСчета Цикл
       НачалоСчета=НачалоСчета+1;
       Сообщить("Обработано "+НачалоСчета+" из "+КонецСчета);
       Если НачалоСчета=Цел(КонецСчета/2)Тогда
           Sleep(10);
           Прервать;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Процедура Sleep(КоличествоСекунд)
   Сообщить("Пауза "+КоличествоСекунд+" сек.");
   ПодключитьОбработчикОжидания("ИмяПроцедурыМодуляПриложения", КоличествоСекунд);
КонецПроцедуры
//***********************************************************************

Модуль объекта:

//***********************************************************************
Процедура Запустить()Экспорт
   НачалоСчета=0;
   КонецСчета=9;
   ИмяПроцедурыМодуляПриложения();
КонецПроцедуры
//***********************************************************************

Результат работы:

Обработано 1 из 9
Обработано 2 из 9
Обработано 3 из 9
Обработано 4 из 9
Пауза 10 сек.
Обработано 5 из 9
Обработано 6 из 9
Обработано 7 из 9
Обработано 8 из 9
Обработано 9 из 9
36 Лойфер
 
27.03.07
15:13
Похвально :)
Я остановился на таком способе:

// Установить задержку
// Парам1 - время задержки в сек.
Процедура Спать(Время)
   Если Время = 0 Тогда
       Возврат
   КонецЕсли;
   Сигнатура = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
   ПутьСкрипта = КаталогВременныхФайлов()+"SleepScript"+Сигнатура+".vbs";
   СкриптФайл = Новый ТекстовыйДокумент;
   СкриптФайл.ДобавитьСтроку("WScript.Sleep("+Формат(Время*1000, "ЧГ=0")+")");
   СкриптФайл.Записать(ПутьСкрипта, КодировкаТекста.OEM);
   WSHShell = Новый COMОбъект("WScript.Shell");
   WSHShell.Run("wscript.exe """+ПутьСкрипта+"""", 0, Истина);
   УдалитьФайлы(ПутьСкрипта);
КонецПроцедуры

Это для восмерки.
37 smaharbA
 
27.03.07
15:21
А для кратности в 1Сек в восьмерке надо всего 3 строчки (на ХР/2003)
38 smaharbA
 
27.03.07
15:25

Для к=1 По 5 Цикл
ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
КонецЦикла;
39 Лефмихалыч
 
27.03.07
15:31
(33) а это зачем?
while(true){WScript.Sleep(1000)};
40 smaharbA
 
27.03.07
15:33
(39) в этом то весь фокус, скрипт крутится бесконечно, такчто объект WScript переданый им в ИЕ живет пока живет скриптхост...
41 Лефмихалыч
 
27.03.07
15:38
(40) о бозэ мой... нет уж, лучше создавать скрипт и его выполнять - накладных расходов в разы меньше