Индикаторы выполнения для задач, которые могут взять неопределенную сумму времени? [закрытый]

Браво моему коллеге (Bruce Eddy). Он нашел способ, которым мы можем выполнить этот вызов командной строки:

installutil.exe /user=uname /password=pw myservice.exe

Это сделано путем переопределения OnBeforeInstall в классе установщика:

namespace Test
{
    [RunInstaller(true)]
    public class TestInstaller : Installer
    {
        private ServiceInstaller serviceInstaller;
        private ServiceProcessInstaller serviceProcessInstaller;

        public OregonDatabaseWinServiceInstaller()
        {
            serviceInstaller = new ServiceInstaller();
            serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
            serviceInstaller.ServiceName = "Test";
            serviceInstaller.DisplayName = "Test Service";
            serviceInstaller.Description = "Test";
            serviceInstaller.StartType = ServiceStartMode.Automatic;
            Installers.Add(serviceInstaller);

            serviceProcessInstaller = new ServiceProcessInstaller();
            serviceProcessInstaller.Account = ServiceAccount.User; 
            Installers.Add(serviceProcessInstaller);
        }

        public string GetContextParameter(string key)
        {
            string sValue = "";
            try
            {
                sValue = this.Context.Parameters[key].ToString();
            }
            catch
            {
                sValue = "";
            }
            return sValue;
        }


        // Override the 'OnBeforeInstall' method.
        protected override void OnBeforeInstall(IDictionary savedState)
        {
            base.OnBeforeInstall(savedState);

            string username = GetContextParameter("user").Trim();
            string password = GetContextParameter("password").Trim();

            if (username != "")
                serviceProcessInstaller.Username = username;
            if (password != "")
                serviceProcessInstaller.Password = password;
        }
    }
}
5
задан Bhargav Rao 1 July 2018 в 09:18
поделиться

7 ответов

Исследования юзабилити (я не могу найти PDF-файл) показали, что при одинаковой продолжительности загрузка баров с разными шаблонами (экспоненциальными, линейными, логарифмическими), которые "ощущались быстрее", где те, которые завершились экспоненциально. Под этим я подразумеваю те, которые начинаются медленно, но со временем становятся все быстрее.

Обычно я делаю следующее:

  • Если я знаю среднее время, которое может занять процесс, выделю еще немного и продолжаю медленно до последних 20% -10%, тогда индикатор выполнения ускоряется и догоняет реальный прогресс, с таким расчетом времени, что процесс заканчивается в тот момент, когда индикатор набирает максимальную скорость.
  • Если я не знаю сколько времени это может занять, я измеряю много раз, чтобы получить приблизительное значение (секунды? минуты? часы?)
    • Если это повторяющаяся операция с небольшими вариациями между запусками, я принимаю во внимание время последних запусков.
    • Если это длительная операция или с высокой изменчивостью, я использую не индикатор выполнения, а скорее анимацию чтобы показать, что я работаю.

Только не лгите своим пользователям. Никогда не сообщайте им, что это закончится через минуту, а через полчаса все еще работает.

6
ответ дан 18 December 2019 в 06:51
поделиться

Я превращаюсь в большого поклонника вращающегося круга в стиле Mac и Vista, который указывает на прогресс, не вводя в заблуждение ожиданий пользователей.

Комикс XKCD
http://xkcd.com/ 612 /

https://imgs.xkcd.com/comics/estimation.png

6
ответ дан 18 December 2019 в 06:51
поделиться

Определенно индикатор выполнения стойки для парикмахера. Я думаю, что это стандарт Mac Human Interface Guidelines (HIG). Я уверен, что аналогичные «неопределенные» индикаторы выполнения существуют и для других платформ.

Я бы также поставил текстовый индикатор выполнения (например, количество переданных байтов). «Угадать» процент выполнения вполне возможно, но вы определенно должны очень быть уверены в среднем времени и его стандартном отклонении, иначе вы разозлите множество разгневанных пользователей и нажмете «Отменить», потому что ваш прогресс застревает на 99% с одного часа. Это будет очень неприятно для них и для репутации вашей программы.

3
ответ дан 18 December 2019 в 06:51
поделиться

Не имеет значения, движется ли индикатор выполнения с точно постоянной скоростью. В самом деле, если понимать буквально, это было бы почти невозможно. Как вы можете заранее узнать, какие факторы могут сыграть роль, чтобы ускорить или замедлить реальный прогресс?

Поэтому я выбираю любую удобную меру того, сколько работы нужно сделать, и отслеживаю процент выполнения. Если это количество байтов для передачи, количество записей для обработки, количество foos для блокировки, что угодно. Конечно, иногда все начинается быстро, а затем замедляется или наоборот. Но все, что действительно имеет значение, - это то, что пока процесс идет к завершению, он продолжает двигаться.

Я думаю, что сложная проблема заключается в том, что вы не знаете заранее НИКАКОЙ разумной меры объема работы, которую нужно сделать. . Например, вам нужно обработать набор записей, но у вас нет простого способа получить счетчик записей, кроме чтения всех записей и их подсчета, и как только вы это сделаете, вы могли бы просто обработать их вдоль путь. В этих случаях вместо индикатора выполнения я обычно прибегаю к отображению «счетчика выполнения»: например, «1 запись обработана», «2 записи обработаны» и т. Д. По крайней мере, пользователь может видеть, что он движется, и после того, как он это сделал, несколько раз он, вероятно, имеет приблизительное представление о том, как далеко это зайдет, т.е. s в десятках тысяч против сотен тысяч и т. д.

Сейчас я работаю над системой, которая обычно использует подход, который я считаю довольно неубедительным: они просто присваивают совершенно произвольные проценты любой удобной контрольной точке. Например, если функция считывает набор данных, сортирует их, форматирует и печатает, они скажут 25%, когда чтение завершено, 50%, когда сортировка завершена, 75%, когда форматирование выполнено, а затем 100%, когда печать сделана. Полагаю, это лучше, чем ничего.

75% при форматировании, а затем 100% при печати. Полагаю, это лучше, чем ничего.

75% при форматировании, а затем 100% при печати. Полагаю, это лучше, чем ничего.

3
ответ дан 18 December 2019 в 06:51
поделиться

Я никогда не видел этого, но как насчет скользящего окна над индикатором выполнения, чтобы вы могли видеть, идет ли работа, с какой скоростью, но конец остается тем же битом дальше. Что-то вроде лунной прогулки для индикаторов прогресса. Вам нужно будет сделать анимацию отличительной, чтобы пользователь мог сказать, что добавляются новые капли, а самые старые сдвигаются влево. Скольжение прекращается, когда программа определяет, что ей известно расстояние до конца задачи.

2
ответ дан 18 December 2019 в 06:51
поделиться

Лучшая стратегия - быть ясным, простым и честным. Расскажите, что известно, и оправдайте ожидания.

Если это может занять много времени, лучше быть подробным, например:

==============================================================================
  Executing command xyz.. 

     Started: 10:30 AM (usually requires about 20 minutes to complete)

     Status: 10:35:10 AM.. Still working...{this line needs to update frequently}

  [Send to background]    [Cancel]
==============================================================================

Я где-то видел такие подробные описания в некоторых крупных установщиках; не могу вспомнить, где именно, но, вероятно, это была операционная система или серверное программное обеспечение. Фразы вроде «Эта задача может занять несколько минут» также не редкость для установщиков.

Если задача обычно занимает короткое время (скажем, 30 секунд), но иногда может занимать больше времени, вероятно, лучше всего показать только индикатор того, что задача не зависла или иным образом не работает, если и только если это можно установить. то есть, если вы можете точно сказать, что задача не зависла и не умерла. Если вы, как конечный пользователь, не уверены в том, что происходит с задачей, лучше всего просто показать опцию фона (чтобы позволить пользователю делать что-то еще, пока она продолжается) или опцию отмены (если задача может быть отменено).

Типичным примером может служить консоль администратора базы данных, которая позволяет пользователю выполнять SQL-запрос к базе данных. Обычно запросы удовлетворяются в течение нескольких секунд, но нечасто бывают случаи, когда для запроса требуются большие декартовы произведения, создание нескольких временных таблиц, ожидание снятия блокировок и т. Д., Что может занять несколько минут. Программное обеспечение консоли администратора не может определить, сколько времени может занять запрос, потому что вся информация об ожидаемом времени выполнения запроса может быть известна только серверу базы данных. В этом случае:

2
ответ дан 18 December 2019 в 06:51
поделиться

Почему бы не увеличивать индикатор выполнения по мере выполнения задач в методе?

Сколько времени занимает задача или процесс, не имеет значения, можно просто увеличить значение индикатора выполнения на величину X, если Y часть задачи выполнено, или вы Z еще далеко в процессе. (т.е. каждые 5 килобайт, которые обрабатываются при загрузке файла размером 100 килобайт)

1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: