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

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 Ответить
Оставьте свое сообщение

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