Каким образом возможно реализовать правильную работу отображения состояния прогресса(индикации) при чтении из файла?
Как вобще рассчитать размер индикатора и соответственно шаг??
&НаКлиенте
Процедура Команда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;
КонецЦикла;
КонецПроцедуры
ПоказатьКак вобще рассчитать размер индикатора и соответственно шаг??
По теме из базы знаний
Найденные решения
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Manticor, надо ответить себе на следующий вопрос: что есть для вас шаг прогресса? Как пример - считывание одной строки, тогда шаг будет равен 1, а предельное значение индикатора - общее количество строк, которое необходимо считать. Тогда задаем переменную, которая будет отвечать за номер загруженной строки и, соответственно, за прогресс полосы индикатора. Если нужно загружать несколько файлов - можно и 2 индикатора впихнуть: один отвечает за общий прогресс (шаг - 1, предельное значение - количество файлов), а другой - за прогресс чтения строк/символов; при этом, после загрузки файла целиком - обнуляем значение у индикатора, отвечающего за текущий прогресс. Как подытог: шаг можно брать за 1, а максимальное значение - количество чего-нибудь (символов, строк, файлов). Дальше уже дело техники и воображения)
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
(11) к сожалению, отображение прогресса на клиенте при выполнении действий на сервере куда более нетривиальная задача, чем кажется. Либо делите файл на части, и частями передавайте на сервер, либо поищите на инфостарте, были подходы к решению.
Упд, просмотрел, вы и так по частям отправляете.
Упд, просмотрел, вы и так по частям отправляете.
Вы имеете ввиду, что затруднительно отобразит mhtfkmysq ход процесса, если он выполняется на сервере
а вызов идет с клиента, например
а вызов идет с клиента, например
н=0;
Для НомерСтроки = строчка по Текст.КоличествоСтрок() Цикл
// получить строку файла с указанным номером
Стр = Текст.ПолучитьСтроку(НомерСтроки);
// Стр = Текст.ПрочитатьСтроку();
//Сообщить(Стр);
Если Стр = Неопределено Тогда
Продолжить;
КонецЕсли;
Сообщить(н);
РазложитьСтроку2(стр," ");//на сервере
н=н+1; //после выполнения функции увеличиваем значение и сосотояние
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок());
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот