Индикация процесса выполнения фонового задания функцией Состояние()
Тестирую индикацию процесса выполнения фоновых заданий через ПолучитьСообщенияПользователю(), Состояние() и обработчик ожидания. В результате работы такого когда окошко, которое появляется при вызове функции Состояние() "мигает", что очень неприятно. Уменьшать интервал опроса сервера еще (в начале там была 1 секунда) не хочется. Есть какие-то варианты, как обойти "мигание"? Пока только пришел к мысли, что нужно сделать отдельную форму, со своим индикатором, на которой будет производиться опрос сервера. Кроме убирания мигания это также позволит пользователю работать с другими окнами, пока идет выполнение какой-то долговременной операции. Кто-то еще так делает? Поделитесь опытом.
Код фонового задания (в принципе, неважен)
P.S. Если кому-то в голову придет проверить, тестировать надо на клиент-серверной базе, т.к. в файловой фоновые задания не работают.
&НаКлиенте
Перем УИД;
&НаКлиенте
Процедура Команда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. Если кому-то в голову придет проверить, тестировать надо на клиент-серверной базе, т.к. в файловой фоновые задания не работают.
По теме из базы знаний
Найденные решения
Предлагаю следующее решение: сделать форму с индикатором отдельно. Добавить в общие формы, добавить реквизит Индикатор, вывести поле соответствующего вида.
В вашу тестовую форму добавляем:
В процедуру Команда1 в конец:
В процедуру П2 после Состояние:
В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
В вашу тестовую форму добавляем:
&НаКлиенте
Перем ФормаСост;
В процедуру Команда1 в конец:
ФормаСост = ПолучитьФорму("ОбщаяФорма.СостояниеУпр");
ФормаСост.Открыть();
В процедуру П2 после Состояние:
ФормаСост.Индикатор = Число(Сообщение.Текст);
В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Предлагаю следующее решение: сделать форму с индикатором отдельно. Добавить в общие формы, добавить реквизит Индикатор, вывести поле соответствующего вида.
В вашу тестовую форму добавляем:
В процедуру Команда1 в конец:
В процедуру П2 после Состояние:
В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
В вашу тестовую форму добавляем:
&НаКлиенте
Перем ФормаСост;
В процедуру Команда1 в конец:
ФормаСост = ПолучитьФорму("ОбщаяФорма.СостояниеУпр");
ФормаСост.Открыть();
В процедуру П2 после Состояние:
ФормаСост.Индикатор = Число(Сообщение.Текст);
В итоге две формы с индикатором, нижняя моргает. Но теперь новая проблема, эта форма может прятаться. Отразить модально?
Сделал отдельную форму с индикатором. Открываю ее немодально. Фоновое задание по задумке еще возвращает отчет о проделанной работе, и эта форма в дополнение к функции индикации еще через ПоместитьВоВременноеХранилище() и Оповестить() оповещает о выполнении.
Прикрепленные файлы:
ВыполнениеФоновыхЗаданий.epf
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот