Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Пауза в коде 2 страниц V   1 2 >          
Vofka Подменю пользователя
сообщение 28.08.12, 14:53
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Понадобилось мне сегодня сделать паузу в коде. Работа присходит на сервере, так что Предупреждение не подходит. Мотать цикл тоже не подходит, ибо грузит сильно проц. На просторах было найдено такое решение:

ИнтервалОжидания = Таймаут*1000;
    ИмяФайлаВрем = ПолучитьИмяВременногоФайла("js");
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.УстановитьТекст
    (
    "if (WScript.Arguments.Count()==0)
    |    WScript.Quit();
    |else
    |    if (isNaN(parseInt(WScript.Arguments(0))))
    |        WScript.Quit();
    |WScript.Sleep(WScript.Arguments(0));"
    );
    ТекстовыйДокумент.Записать(ИмяФайлаВрем,КодировкаТекста.ANSI);
    WshShell = Новый COMОбъект("WScript.Shell");
    WshShell.Run("wscript.exe """+ИмяФайлаВрем+""" "+Формат(ИнтервалОжидания,"ЧГ=0"),0,-1);
    УдалитьФайлы(ИмяФайлаВрем);


Найдено было в нескольких источниках, поэтому копирайты не указываю.

Спасибо сказали: logist, mister-x,

pablo Подменю пользователя
сообщение 29.08.12, 9:18
Сообщение #2

Старейшина
********
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0

Ээх. И опять исключительно виндовый способ sad.gif


Signature
Правильно поставленный вопрос содержит до 90% ответа.

Vofka Подменю пользователя
сообщение 29.08.12, 9:36
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

bk.gif

pumbaE Подменю пользователя
сообщение 29.08.12, 9:52
Сообщение #4

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 113
Из: Запоріжжя
Спасибо сказали: 63 раз
Рейтинг: 0

Линуксовй вроде только один: поднять web сервер, там простейший cgi скрипт sleep и на сервере вызывать страничку через http соединение.


Signature
Эт я почему раньше злой был? Потому, что у меня снегопата не было!

yaxus Подменю пользователя
сообщение 10.10.12, 11:54
Сообщение #5

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 3 раз
Рейтинг: 0

Делал задержку на 1С так, вместо 28882 можно любой свободный порт.

Procedure Ожидание(Таймаут)
    ВремяЗавершения = CurrentDate() + Таймаут;
    While CurrentDate() < ВремяЗавершения Do
        Try
            Соединение = New FTPConnection("127.0.0.1", 28882);
        Except
        EndTry;                    
    EndDo;
EndProcedure

Спасибо сказали: kosta_ks, mister-x, Vofka,

AnryMc Подменю пользователя
сообщение 11.10.12, 8:58
Сообщение #6

Оратор
Иконка группы
Группа: Местный
Сообщений: 313
Спасибо сказали: 95 раз
Рейтинг: 96.6

На "заре" программирования, меня учили, что передача управления на маркер и ожидание - это как минимум плохой код, и допустим только в крайнем случае...

Зачем нужна пауза?

Обычно в это время что-то происходит. Тогда этим "что-то" можно (нужно) управлять. Например запускается внешняя программа и нужно ждать ее окончания - тогда:

Перем oExec Экспорт

Функция ЗапуститьПрограмму() Экспорт
    
    Попытка
        
        WshShell = НОВЫЙ COMОбъект("WScript.Shell");
        oExec = WshShell.Exec("d:\Program Files\Программа.exe");
        
        //Сообщить(СокрЛП(oExec.Status), СтатусСообщения.Информация);
        //ИД= oExec.ProcessID;
        //Сообщить("ИД процесса:"+ИД, СтатусСообщения.Информация);
        
        Возврат Истина;
        
    Исключение
        
        Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
        oExec=Неопределено;
        
        Возврат Ложь;
        
    КонецПопытки;
    
КонецФункции

Процедура ЗакрытьПрограмму() Экспорт
    
    СостояниеПрограммы=oExec.Status;
    НомерПопытки=0;
    
    Пока СостояниеПрограммы=0 Цикл
        
        //ОбработкаПрерыванияПользователя();
        
        НомерПопытки=НомерПопытки+1;
        Состояние("Закрытие ПРОГРАММЫ - "+СокрЛП(НомерПопытки));
        oExec.Terminate();
        СостояниеПрограммы=oExec.Status;
        
        Если НомерПопытки>50 Тогда
            Сообщить("Не смогли выгрузить ПРОГРАММУ за 50 попыток", СтатусСообщения.Внимание);
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры;


Тогда можно ожидать окончания программы - СостояниеПрограммы=oExec.Status;

Как правило, и в других ситуациях есть решение - просто нужно "сформулировать вопрос по другому"

Сообщение отредактировал Vofka - 11.10.12, 9:00

Vofka Подменю пользователя
сообщение 11.10.12, 9:06
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

yaxus , не пробовал ещё, но возьму на заметку smile.gif .
Хотя поторопился. Тоже ж цикл используете..
add: хотя, если добавлять таймаут, то ваш вариант имеет место быть smile.gif

AnryMc, замечательно. Вот только про цикл я писал в самом первом сообщении.

Цитата(AnryMc @ 11.10.12, 9:58) *
передача управления на маркер и ожидание - это как минимум плохой код

Обоснуйте.

Сообщение отредактировал Vofka - 11.10.12, 9:08

alex040269 Подменю пользователя
сообщение 11.10.12, 9:27
Сообщение #8

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

можно использовать банальный ping 127.0.0.1 и таймаут и количество - все можно задать параметрами smile.gif


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

logist Подменю пользователя
сообщение 17.07.14, 17:23
Сообщение #9

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Написал такое, потом подумал, может что-то есть оптимальней, но не нашел...
Процедура Пауза(Секунд = 1)
    КонецПаузы = ТекущаяДата() + Секунд;
    Пока ТекущаяДата() < КонецПаузы Цикл
        // ...
    КонецЦикла;
КонецПроцедуры


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Vofka Подменю пользователя
сообщение 18.07.14, 7:19
Сообщение #10

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

logist, такой метод - убийство для процессора.

TipsyKID Подменю пользователя
сообщение 18.07.14, 8:34
Сообщение #11

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Если нужен метод не использующий внешнюю среду :

Создаем форму выбора, в ней через ПодключитьОбработчикОжидания делаем аля таймер, если больше определенного времени, то форму выбора закрыть.

В нужной нам части алгоритма вызываем ( не открываем ) эту формувыбора модально ждем... профит.


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

logist Подменю пользователя
сообщение 18.07.14, 8:38
Сообщение #12

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(TipsyKID @ 18.07.14, 8:34) *
профит.

Это слишком долго (в плане выполнения кода), у меня задача по проще, вероятно ее можно решить по другому, этот код просто первое что пришло на ум.

Цитата(Vofka @ 18.07.14, 7:19) *
убийство для процессора.

в прямом смысле? т.е. процессор как-то убивается физически? (это не стеб, реальный вопрос)


Signature
Личные бесплатные консультации не даю, для этого есть форум!

TipsyKID Подменю пользователя
сообщение 18.07.14, 8:41
Сообщение #13

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Цитата(logist @ 18.07.14, 9:38) *
Это слишком долго (в плане выполнения кода)


а вот тут вообще не понял, делали замеры производительности ( пруфы плз. ) ?


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

logist Подменю пользователя
сообщение 18.07.14, 9:26
Сообщение #14

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(TipsyKID @ 18.07.14, 8:41) *
а вот тут вообще не понял, делали замеры производительности ( пруфы плз. ) ?

Дело не в замерах производительности (и зачем сразу требовать пруфы?), субъективные ощущения реализации, делать форму, подключать обработчик, это слишком сложно для задачи где нужна пауза в пол секунды.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

TipsyKID Подменю пользователя
сообщение 18.07.14, 9:34
Сообщение #15

Оратор
Иконка группы
Группа: Местный
Сообщений: 413
Из: Киев
Спасибо сказали: 161 раз
Рейтинг: 0

Цитата(logist @ 18.07.14, 10:26) *
Дело не в замерах производительности (и зачем сразу требовать пруфы?), субъективные ощущения реализации, делать форму, подключать обработчик, это слишком сложно для задачи где нужна пауза в пол секунды.


5-ть минут на реализацию этого метода, малая цена за кроссплатформенность.


Signature
Специалист : Технологическая платформа 8.х, Бухгалтерия для Украины, Управление торговлей для Украины, Зарплата и Управление Персоналом для Украины

Vofka Подменю пользователя
сообщение 18.07.14, 10:17
Сообщение #16

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(logist @ 18.07.14, 9:38) *
в прямом смысле? т.е. процессор как-то убивается физически? (это не стеб, реальный вопрос)

Не физически, а логически smile.gif . Я имел ввиду, что такая пауза заставляет процессор сильно шевелиться.

alex040269 Подменю пользователя
сообщение 18.07.14, 14:57
Сообщение #17

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

ВБСкрипт = СоздатьОбъект("WScript.Shell");                                                                                     
ВБСкрипт.Run("cscript "+ ИмяСкрипта , 0,-1);    // Пауза


ИмяСкрипта = Имя файла с содержимым:
Цитата
WScript.Sleep(250);


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

logist Подменю пользователя
сообщение 18.07.14, 15:59
Сообщение #18

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(alex040269 @ 18.07.14, 14:57) *
Имя файла с содержимым:

для этого еще надо сохранять файл с этим содержимым, что тоже вызывает дополнительные действия системы.


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Sharzem Подменю пользователя
сообщение 19.07.14, 21:03
Сообщение #19

Оратор
Иконка группы
Группа: Местный
Сообщений: 298
Спасибо сказали: 98 раз
Рейтинг: 99.1

Вставлю свои 5 коп., хотя в 8-й версии не пишу. В 7.7. очень хорошо с таким заданием справляется DialMail.dll и мне что-то кажется что 8-я ее тоже поддерживает.


Синтаксис на 7.7.
Ожидание(<Мсек>);
Назначение
Приостанавливает работу 1С на <Мсек> миллисекунд без загрузки процессора. Окно 1С в данное время не перерисовывается.
Возвращаемое значение:
НЕТ
Параметры:
<Мсек> - число. Количество миллисекунд ожидания.

Пример кода на 7.7.:

Перем SystComm;

Процедура При открытии()

Если ЗагрузитьВнешнююКомпоненту("DialMail.dll") <> 1 Тогда
        Сообщить("Компонента 'DialMail.dll' не найдена", "!");
    КонецЕсли;
SystComm = СоздатьОбъект("AddIn.SystComm");

КонецПроцедуры;

Процедура Пауза(Время)
    SystComm.Ожидание(прВремя);
КонецПроцедуры




Signature
То, что для одного человека константа, для другого - переменная. (Алан.Дж.Перлис)

Vofka Подменю пользователя
сообщение 05.12.14, 10:55
Сообщение #20

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Сегодня понадобилось снова сделать паузу. Нашел ещё один вариант решения:

ВС_Шелл = Новый COMОбъект("WScript.Shell"); // для 7.7: ВС_Шелл = СоздатьОбъект("WScript.Shell");
КоличествоСекунд = 10;
ВС_Шелл.Run("ping 127.0.0.1 -n "+КоличествоСекунд, 0, 1);


Правда у меня пауза получается на 1 секунду меньше, чем указано в КоличествоСекунд. Естественно, это не критично, просто надо принять к сведенью smile.gif

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 3:41
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!