1. C# / Говнокод #13646

    +141

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    /// <summary>
    		/// Стартовый метод потока, который отображает процесс вычисления.
    		/// </summary>
    		public static void LoadingThread()
    		{
    			int curLoadingStep = 0;
    
    			while(!bStop)
    			{
    				Console.Clear();
    
    				switch(curLoadingStep)
    				{
    					case 0:
    						Console.WriteLine("Производится вычисление");
    						curLoadingStep = 1;
    					break;
    
    					case 1:
    						Console.WriteLine("Производится вычисление.");
    						curLoadingStep = 2;
    					break;
    
    					case 2:
    						Console.WriteLine("Производится вычисление..");
    						curLoadingStep = 3;
    					break;
    
    					case 3:
    						Console.WriteLine("Производится вычисление...");
    						curLoadingStep = 0;
    					break;
    				}
    
    				Thread.Sleep(800);
    			}
    		}

    Наткнулся на форуме.
    Чего то в этой жизни я явно не понимаю

    Запостил: kegdan, 22 Августа 2013

    Комментарии (17) RSS

    • Ведь как то так лучше? Предлагайте свои варианты
      public static void LoadingThread()
              {
                  Console.Write("Производится вычисление");
                  var curLoadingStep = 0;
      
                  while (!bStop)
                  {
                      if (curLoadingStep < max)
                      {
                          Console.Write(".");
                      }
                      else
                      {
                          EraseFromConsole(max);
                          curLoadingStep = 0;
                      }
                      Thread.Sleep(700);
                      curLoadingStep++;
                  }
              }
              private static void EraseFromConsole(int max)
              {
                  for (var i = 0; i < max; i++)
                  {
                      Console.Write("\b \b");
                  }
              }
      Ответить
      • пока есть Thread.Sleep - не лучше.
        Ответить
        • Укажите путь, гуру
          Ответить
          • По таймеру, без блокировки потока на ожидание.
            Ответить
            • А смысл? Суть то та же самая - тред спит 700мс и выводит/стирает точку. Ну только спать будет не в Thread.Sleep, а в цикле обработки сообщений. По производительности никакой разницы, имхо, не будет. По читабельности будет хуже, т.к. с таймером всяко больше кода. Да и отдельный тред под таймер один хрен поднимать, т.к. скорее всего главный занят всасыванием файлов или каким-то блокирующим вычислением, и никакие ивенты в это время не обрабатывает.

              P.S. И кстати, есть ли смысл оптимизировать усложнять херню, которая вполне читабельна и никак не сказывается на производительности? :)

              P.P.S. Если бы я что-то и переделывал - то я бы попробовал выводить проценты выполнения, а не точки. Если их конечно можно вытрясти у расчетного потока. С процентами ждать намного приятней.
              Ответить
              • >P.P.S. Если бы я что-то и переделывал - то я бы попробовал выводить проценты выполнения, а не точки. Если их конечно можно вытрясти у расчетного потока. С процентами ждать намного приятней

                Тут уже не параллельный поток ожидания ставить, а подписываться на Event. Вообще сама идея отображения точек во время ожидания через вбитый тайминг глупа и безобразна.
                Ответить
                • > Тут уже не параллельный поток ожидания ставить, а подписываться на Event.
                  Ну вот это вариант, кстати. Чтобы вычислительный поток сам эти проценты и выводил, с развязкой расчетов и вывода через ивент.

                  > Вообще сама идея отображения точек во время ожидания через вбитый тайминг глупа и безобразна.
                  Если вычислительный поток занят расчетами, и у него нет никаких средств информирования о прогрессе (например ивентов), а перепиливать его нельзя, то что еще можно сделать? Только точками в соседнем треде и срать ;)
                  Ответить
                  • Я о том, что это самый примитивный вариант, и он не на много лучше обычного вычисления без параллелизма с зависанием API

                    Нужно информировать юзера
                    Ответить
              • Смысл такой что роль таймера должен выполнять таймер, а не Thread.Sleep. Если вы не понимаете семантической разницы - то я не могу представить как вы пишете абстракции. У вас наверное и string для хранения чисел подходит.
                Ответить
                • Для консольной программы вполне нормальна ситуация, когда основной поток не обрабатывает ивенты, а занимается непосредственно выполнением какой-то задачи. Поэтому если мы и будем юзать таймер - то для обработки его ивентов все равно нужен отдельный поток, как и с Thread.Sleep.

                  > Если вы не понимаете семантической разницы - то я не могу представить как вы пишете абстракции.
                  Абстракция: "Класс WaitIndicator, при вызове start() начинающий выводить точки каждые 700мс, и прекращающий это делать по вызову какого-нибудь stop(). Точки должны выводиться даже если главный поток занят работой". Ваша реализация - запускаем тред, в нем запускаем таймер, по тику таймера выводим точку. Приведенная выше реализация - запускаем тред, спим Nмс, выводим точку. Реализации разные, абстракция одна, что с ней не так? :) Но реализация с Thread.Sleep короче и проще. Что в ней несемантичного?

                  Если вы имели в виду какую-то другую реализацию, или вам не нравится приведенная мной абстракция - прошу привести ваш вариант, а не переходить на личности.
                  Ответить
                • О, вон там че. В шарпе, оказывается, обработчик таймера (System.Timers.Timer) и так исполняется в тредпуле... Тогда беру свои слова обратно ;) Таймер тут вполне адекватен, и свой поток не нужен.

                  А проблема тут не в том, что я не умею писать абстракции, а всего лишь в том, что я на шарпе никогда не писал, и не знаю его либ ;(
                  Ответить
    • автор просто хотел написать конечный автомат
      Ответить
    • вычисление чего? шагов?
      Ответить
    • А разве виндовые терминалы забой (\b) не поддерживают?
      Ответить
    • По мне это вовсе симуляция бурной деятельности.
      Ответить
    • public Task<int> LoadingSonthingAsync(IProgress<int> progress);

      public class Progress<T> : IProgress<T>
      {
      public Progress();
      public Progress(Action<T> handler);
      protected virtual void OnReport(T value);
      public event EventHandler<T> ProgressChanged;
      }
      Но я сначала всё не так понял, они просто ждут, когда всё закончится.
      Ответить

    Добавить комментарий