Имя: Пароль:
1C
1С v8
Как сделать не жрущую процессор паузу средствами платформы 1С (без Новый COMОбъект)?
0 ptiz
 
27.01.22
16:10
Как сделать не жрущую процессор паузу средствами платформы 1С ?

У меня до 100 фоновых заданий, которым одновременно нужна разной длительности пауза, и в таких случаях с паузами через COMОбъект идут глюки - меньшая пауза может отработать дольше чем надо.

Пробовал вот эти методы, они дают паузу и не глючат, но жрут процессор точно так же как цикл:
Новый FTPСоединение(, , , , , ЦелыхСекунд)
Новый HTTPСоединение(, , , , , ЦелыхСекунд)


Есть решение?
1 ДенисЧ
 
27.01.22
16:13
1с паузу так и не сделало.
2 ptiz
 
27.01.22
16:13
(1) Угу. И воспроизведения звуков нет.
3 pechkin
 
27.01.22
16:14
для рег заданий делай паузу на расписании.
Типа повторять чрез n секунд
4 pechkin
 
27.01.22
16:15
кстати можно же через ожидание фонового сделать
5 ptiz
 
27.01.22
16:17
(3) Упрощенно: эти 100 фоновых конкурируют за общий ресурс, интервалы должны быть не меньше допустимых, но минимальными.
6 Guk
 
27.01.22
16:21
(2) СредстваМультимедиа (MultimediaTools)
ВоспроизвестиАудио (PlayAudio)
Синтаксис:
ВоспроизвестиАудио(<Аудио>, <НачальнаяПозиция>, <ОбработчикОстановкиВоспроизведения>, <РазрешитьФоновое>)
7 ДенисЧ
 
27.01.22
16:23
(6) Доступность:
Мобильный клиент, мобильное приложение (клиент).
8 Kassern
 
27.01.22
16:25
9 asady
 
27.01.22
16:26
(0) делай полноценный асинхрон
зачем тебе эти паузы
нужна проверка доступен запуск - недоступен
типа проверки флагов
если недоступен флаг выход из задания
в следующем запуске заново проверяй
10 Garykom
 
гуру
27.01.22
16:27
(0) Никак.

Перепиши свой "алгоритм" без пауз
11 Kassern
 
27.01.22
16:27
а вообще есть ОбщегоНазначенияБТС.Пауза(Секунд);
12 nicxxx
 
27.01.22
16:28
13 Garykom
 
гуру
27.01.22
16:28
(5) добавь еще одно фоновое которое и будет распределять ресурс, запуская нужные фоновые
14 Guk
 
27.01.22
16:29
(7) но сделали же!!!...
15 ptiz
 
27.01.22
16:31
(8) Спасибо. Читаю.
16 Kassern
 
27.01.22
16:32
Процедура Пауза(Секунд) Экспорт
    
    ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();
    ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание();
    
    Если ФоновоеЗадание = Неопределено Тогда
        Параметры = Новый Массив;
        Параметры.Добавить(Секунд);
        ФоновоеЗадание = ФоновыеЗадания.Выполнить("ОбщегоНазначенияБТС.Пауза", Параметры);
    КонецЕсли;
        
    Попытка
        ФоновоеЗадание.ОжидатьЗавершения(Секунд);
    Исключение
        Возврат;
    КонецПопытки;
    
КонецПроцедуры
17 ptiz
 
27.01.22
16:33
(16) Да, похоже то, что надо. И вроде давно как-то читал, забыл.
18 ptiz
 
27.01.22
16:35
(16) а.... это в типовых уже. Раньше были только костыли.
19 Kassern
 
27.01.22
16:36
(18) именно, иногда полезно в бсп глянуть
20 ptiz
 
27.01.22
16:47
(19) Вот я и взял когда-то из типовой, там жуть, особенно учитывая кол-во кода в ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму! :)

Процедура Таймаут(Миллисекунды = 1000)
    
    НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    Параметры = ОбщегоНазначенияКлиентСервер.ПараметрыЗапускаПрограммы();
    Параметры.ДождатьсяЗавершения = Истина;
    ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму(СтрШаблон("ping -n 1 -w %1 127.255.255.255", Формат(Миллисекунды, "ЧДЦ=0; ЧГ=")), Параметры);
    
    Пока (ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера) < Миллисекунды Цикл
        // Если нужное время не прошло, оставшееся время дождемся в цикле.
    КонецЦикла;
    
КонецПроцедуры
21 youalex
 
27.01.22
16:52
(2) А как же повсеместно используемый Сигнал() ? ))