Индикатор прогресса при чтении из файла

1. Manticor 66 29.03.13 12:58 Сейчас в теме
Каким образом возможно реализовать правильную работу отображения состояния прогресса(индикации) при чтении из файла?

&НаКлиенте
Процедура Команда1(Команда)
		Перем Стр;
		Стр = "";
		
		//Открываем диалог выбора файла для чтения   caller SMDR
		ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		ВыборФайла.МножественныйВыбор = Ложь;
		ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
		ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.txt)|*.txt'");
		Если ВыборФайла.Выбрать() Тогда
			ИмяФайлаCaller = ВыборФайла.ПолноеИмяФайла;
		Иначе
			Сообщить("Вы не выбрали имя фала, повторите попытку!");
				Отказ = Истина;
				Возврат;
		КонецЕсли;

		//читаем сначала номер строки с которой будем читать файл
		НомерСтрLog = Новый ЧтениеТекста;
		
		НомерСтрLog.Открыть(ПутьКLog());
		стрВномере = НомерСтрLog.ПрочитатьСтроку();
		НомерСтрLog.Закрыть();
		
		Если стрВномере = Неопределено тогда
			
			Сообщить("Внимание! Файл читается впервые ", СтатусСообщения.Важное);
			
			Текст = Новый ЧтениеТекста;
			Текст.Открыть(ИмяФайлаCaller);//(ПолноеИмяФайла); 41 строка
			
			Стр = Текст.ПрочитатьСтроку();
			Стр = Текст.ПрочитатьСтроку();
			
			//определяем количество строк в файле SMDR
			//Текст.КоличествоСтрок();
			
			н=0; //кол-во строк
			
			//Для Сч = 0 по Текст.КоличествоСтрок()-2 Цикл
				
				Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки 					
					Стр = Текст.ПрочитатьСтроку();
					Сообщить(Стр); 
					Если Стр = Неопределено Тогда
						Продолжить;
					КонецЕсли;  
					Сообщить(н);
					РазложитьСтроку2(стр," ");
					Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100); 
					н=н+1;					
				КонецЦикла;
				Текст.Закрыть();
				//пишем номер последней строки
				ЗаписьНомераСтроки(н+2);
			//КонецЦикла;

		Иначе
			ЧислоСтрВномере	= Число(стрВномере);	
			
			Текст = Новый ЧтениеТекста;
			Текст.Открыть(ИмяФайлаCaller);
			
			СчетчикНовФайла = 0;
			Пока Текст.ПрочитатьСтроку() <> Неопределено Цикл
				ОбработкаПрерыванияПользователя();
				СчетчикНовФайла = СчетчикНовФайла + 1;
			КонецЦикла;
			Текст.Закрыть();
			//Сообщить("Строк "+Счетчик);
			
			Если  СчетчикНовФайла < ЧислоСтрВномере  Тогда
				Сообщить("Внимание! количество строк в новом выгруженном файле меньше, чем в предидущем. Переформируйте файл", СтатусСообщения.ОченьВажное);
			ИначеЕсли 	
				СчетчикНовФайла = ЧислоСтрВномере  Тогда
				Сообщить("Внимание! Вы читаете тот же файл. Сделайте повторную выгрузку файла!! ", СтатусСообщения.Внимание);
			Иначе 	
				Сообщить("Чтение файла данных", СтатусСообщения.Важное);	
				ПостЧтение(ЧислоСтрВномере,ИмяФайлаCaller);
				//Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100); 
			КонецЕсли;
			 		
		КонецЕсли;
	КонецПроцедуры


&НаСервере
Процедура ПостЧтение(СчетчикНовФайла,ИмяФайлаCaller);
			
		Текст = Новый ТекстовыйДокумент;
		// открытие файла
		Текст.Прочитать(ИмяФайлаCaller);
		// перебор строк текстового документа
		строчка = СчетчикНовФайла+1;
		н=0;
		Для НомерСтроки = строчка по Текст.КоличествоСтрок() Цикл
		 // получить строку файла с указанным номером
		 Стр = Текст.ПолучитьСтроку(НомерСтроки);
		 //	Стр = Текст.ПрочитатьСтроку();
				//Сообщить(Стр); 
		Если Стр = Неопределено Тогда
			Продолжить;
		КонецЕсли;  
			Сообщить(н);
			РазложитьСтроку2(стр," ");
			н=н+1;		

	 КонецЦикла;
КонецПроцедуры
Показать


Как вобще рассчитать размер индикатора и соответственно шаг??
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
5. RocKeR_13 1374 29.03.13 16:45 Сейчас в теме
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RocKeR_13 1374 29.03.13 13:38 Сейчас в теме
(1) Manticor, надо ответить себе на следующий вопрос: что есть для вас шаг прогресса? Как пример - считывание одной строки, тогда шаг будет равен 1, а предельное значение индикатора - общее количество строк, которое необходимо считать. Тогда задаем переменную, которая будет отвечать за номер загруженной строки и, соответственно, за прогресс полосы индикатора. Если нужно загружать несколько файлов - можно и 2 индикатора впихнуть: один отвечает за общий прогресс (шаг - 1, предельное значение - количество файлов), а другой - за прогресс чтения строк/символов; при этом, после загрузки файла целиком - обнуляем значение у индикатора, отвечающего за текущий прогресс. Как подытог: шаг можно брать за 1, а максимальное значение - количество чего-нибудь (символов, строк, файлов). Дальше уже дело техники и воображения)
4. Manticor 66 29.03.13 14:26 Сейчас в теме
(2) RocKeR_13, Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100);
как в состоянии предельное значение определить? н/100 это шаг
3. tolyan_ekb 80 29.03.13 13:56 Сейчас в теме
(1) Manticor, сначала у текстового документа определи КоличествоСтрок(), а потом читай файл ЧтениемТекста и увеличивай на 1 индикактор.
5. RocKeR_13 1374 29.03.13 16:45 Сейчас в теме
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
6. Manticor 66 01.04.13 15:25 Сейчас в теме
(5) RocKeR_13, просто у меня ентот счетчик на сервере в процедуре считается, неужели придется процедуру на функцию переделывать и передавать значение на клиент для Состояние()??
7. KonstB 180 01.04.13 21:24 Сейчас в теме
(6) Manticor, А зачем Вы на сервере читаете файл?
8. Manticor 66 01.04.13 22:35 Сейчас в теме
(7) KonstB, потому как используется ТаблицаЗначений - Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
10. KonstB 180 01.04.13 22:48 Сейчас в теме
(8) Manticor, Видимо я ослеп... где вы ТЗ используете?
11. Manticor 66 01.04.13 23:51 Сейчас в теме
(10) KonstB, в РазложитьСтроку2, а вообще сделал по формуле 100*н/Текст.КоличествоСтрок() - вроде грамотно выводит прогресс. А можно ли сделать, чтобы еще выводилось оставщееся примерное время? или это уже совсем неточный факт?
12. juntatalor 63 02.04.13 09:01 Сейчас в теме
(11) к сожалению, отображение прогресса на клиенте при выполнении действий на сервере куда более нетривиальная задача, чем кажется. Либо делите файл на части, и частями передавайте на сервер, либо поищите на инфостарте, были подходы к решению.

Упд, просмотрел, вы и так по частям отправляете.
9. smaharbA 01.04.13 22:47 Сейчас в теме
13. Manticor 66 02.04.13 14:14 Сейчас в теме
Вы имеете ввиду, что затруднительно отобразит mhtfkmysq ход процесса, если он выполняется на сервере
а вызов идет с клиента, например
н=0;
        Для НомерСтроки = строчка по Текст.КоличествоСтрок() Цикл
         // получить строку файла с указанным номером
         Стр = Текст.ПолучитьСтроку(НомерСтроки);
         //    Стр = Текст.ПрочитатьСтроку();
                //Сообщить(Стр); 
        Если Стр = Неопределено Тогда
            Продолжить;
        КонецЕсли;  
            Сообщить(н);
            РазложитьСтроку2(стр," ");//на сервере
            н=н+1;        //после выполнения функции увеличиваем значение и сосотояние
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок());
Показать
14. kuzev 48 02.04.13 16:32 Сейчас в теме
Посмотрите эту статью - http://infostart.ru/public/157706/. Может поможет.
Оставьте свое сообщение

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