Индикация процесса выполнения фонового задания функцией Состояние()

1. juntatalor 63 15.05.13 12:20 Сейчас в теме
Тестирую индикацию процесса выполнения фоновых заданий через ПолучитьСообщенияПользователю(), Состояние() и обработчик ожидания. В результате работы такого когда окошко, которое появляется при вызове функции Состояние() "мигает", что очень неприятно. Уменьшать интервал опроса сервера еще (в начале там была 1 секунда) не хочется. Есть какие-то варианты, как обойти "мигание"? Пока только пришел к мысли, что нужно сделать отдельную форму, со своим индикатором, на которой будет производиться опрос сервера. Кроме убирания мигания это также позволит пользователю работать с другими окнами, пока идет выполнение какой-то долговременной операции. Кто-то еще так делает? Поделитесь опытом.

&НаКлиенте
Перем УИД;

&НаКлиенте
Процедура Команда1(Команда)
    
    УИД = П();
    ПодключитьОбработчикОжидания("П2", 0.1, Истина);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция П()
    
    ФЗ = ФоновыеЗадания.Выполнить("мФоновыеЗадания.Проц1");
    Возврат ФЗ.УникальныйИдентификатор;
    
КонецФункции

&НаСервереБезКонтекста
Функция П1(УИД, Завершено)
    
    ФЗ = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(УИД);
    
    Если ФЗ = Неопределено Или
        ФЗ.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
        Завершено = Истина;
        Возврат Неопределено;
    Иначе
        Завершено = Ложь;
    КонецЕсли;
    
    Возврат ФЗ.ПолучитьСообщенияПользователю(Истина);
    
КонецФункции

&НаКлиенте
Процедура П2()
    
    Перем Завершено;
    
    Сообщения = П1(УИД, Завершено);
    
    Если Завершено Тогда
        ОтключитьОбработчикОжидания("П2");
        Возврат;
    КонецЕсли;
    
    Если Не Сообщения = Неопределено 
        И Не Сообщения.Количество() = 0 Тогда
        Сообщение = Сообщения.Получить(Сообщения.ВГраница());
        Состояние("Превед", Число(Сообщение.Текст));
    КонецЕсли;
    
    ПодключитьОбработчикОжидания("П2", 0.5, Истина);
    
КонецПроцедуры
Показать


Код фонового задания (в принципе, неважен)
Процедура Проц1() Экспорт
    
    А = 0;
    Б = 0;
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Для ВремПер = 1 По 1000000 Цикл
        
        // Блок мат. операций для увеличения времени работы кода
        А = А + ГСЧ.СлучайноеЧисло(ВремПер);
        А = Log10(А);
        А = А / ГСЧ.СлучайноеЧисло(ВремПер);
        Б = ГСЧ.СлучайноеЧисло(ВремПер);
        А = А * Б + ГСЧ.СлучайноеЧисло();
        А = Log10(А);
        А = А * А;
        А = А + Б;
        А = Log10(А * Б);
        
        Если ВремПер % (Цел(1000000 / 100)) = 0 Тогда
            
            Сообщить(Цел(ВремПер / 1000000 * 100));
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры
Показать


P.S. Если кому-то в голову придет проверить, тестировать надо на клиент-серверной базе, т.к. в файловой фоновые задания не работают.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. DKiguin 15.05.13 17:43 Сейчас в теме
Предлагаю следующее решение: сделать форму с индикатором отдельно. Добавить в общие формы, добавить реквизит Индикатор, вывести поле соответствующего вида.

В вашу тестовую форму добавляем:
&НаКлиенте
Перем ФормаСост;


В процедуру Команда1 в конец:
    ФормаСост = ПолучитьФорму("ОбщаяФорма.СостояниеУпр");
    ФормаСост.Открыть();


В процедуру П2 после Состояние:
ФормаСост.Индикатор = Число(Сообщение.Текст);


В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DKiguin 15.05.13 17:43 Сейчас в теме
Предлагаю следующее решение: сделать форму с индикатором отдельно. Добавить в общие формы, добавить реквизит Индикатор, вывести поле соответствующего вида.

В вашу тестовую форму добавляем:
&НаКлиенте
Перем ФормаСост;


В процедуру Команда1 в конец:
    ФормаСост = ПолучитьФорму("ОбщаяФорма.СостояниеУпр");
    ФормаСост.Открыть();


В процедуру П2 после Состояние:
ФормаСост.Индикатор = Число(Сообщение.Текст);


В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
3. DKiguin 15.05.13 17:56 Сейчас в теме
Кстати посмотрел реализацию http://infostart.ru/public/157706/, там то же моргает.
4. juntatalor 63 15.05.13 18:10 Сейчас в теме
Сделал отдельную форму с индикатором. Открываю ее немодально. Фоновое задание по задумке еще возвращает отчет о проделанной работе, и эта форма в дополнение к функции индикации еще через ПоместитьВоВременноеХранилище() и Оповестить() оповещает о выполнении.
Прикрепленные файлы:
ВыполнениеФоновыхЗаданий.epf
DarkUser; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот