Задержку при итерации по списку

Автор Тема: Задержку при итерации по списку  (Прочитано 7695 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Нужно реализовать задержку при итерации foreach по списку, например переходить к зумированию на следующий элемент только по нажатию Enter. Как можно это реализовать?
Код - C# [Выбрать]
  1. public static void FindPositionMark()
  2.           {
  3.                int desiredPos = GetDesiredPositionNumberFromUser();
  4.                List<Point3d> objectPos = GetBlockReferencesWithDesiredPosition(desiredPos);
  5.                foreach (Point3d posMark in objectPos)
  6.                {
  7.                     AuxiliaryUtilities.ViewUtilities.ZoomExtents(posMark);
  8.  
  9.                }
  10.  
  11.           }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #1 : 30-08-2018, 00:34:15 »
Вот это задержка:
Код - C# [Выбрать]
  1. Thread.Sleep(500);
а вот это:
переходить к зумированию на следующий элемент только по нажатию Enter.
далеко не задержка =))
Точнее определитесь, что вы хотите сделать, чтобы не приходилось гадать на кофейной гуще

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Задержка при итерации по списку
« Ответ #2 : 30-08-2018, 00:51:49 »
я имел в виду переход к следующему элементу списка только после нажатия на клавишу. Иначе сейчас все проходит молниеносно- рассмотреть каждый объект невозможно.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #3 : 30-08-2018, 10:12:21 »
Думаю, Вам нужно отталкиваться от этой темы - Allowing users to escape from long operations in AutoCAD .NET

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #4 : 30-08-2018, 10:15:29 »
Но самый простой способ (в плане реализации) - это сделать окошко с кнопками "назад", "вперед", по нажатию на которые отображать предыдущий элемент в списке или следующий.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Задержку при итерации по списку
« Ответ #5 : 30-08-2018, 12:16:42 »
Думаю, Вам нужно отталкиваться от этой темы - Allowing users to escape from long operations in AutoCAD .NET
Думаю, это немного не из этой оперы. С помощью описанного механизма не получится сделать остановку в каждом цикле.
Но самый простой способ (в плане реализации) - это сделать окошко с кнопками "назад", "вперед", по нажатию на которые отображать предыдущий элемент в списке или следующий.
Это самый правильный, но не самый простой. Самый простой, на мой взгляд - это добавить в конце цикла пользовательский запрос Editor.Get<...>. Выбрать только тот, который больше подойдёт по ситуации (как вариант - Editor.GetKeywords) и правильно настроить.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #6 : 30-08-2018, 12:20:29 »
Думаю, это немного не из этой оперы. С помощью описанного механизма не получится сделать остановку в каждом цикле.
Пример как раз из той оперы. Там показано, как определить нажатие Esc и прервать бесконечный цикл.
В случае с текущим вопросом в каждом заходе при итерации списка элементов нужно создавать такой-же бесконечный while, в котором "ловить" и Enter и Esc и обрабатывать их по-своему

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #7 : 30-08-2018, 12:22:44 »
Что-то около того
Код - C# [Выбрать]
  1. foreach (var someValue in someValues)
  2. {
  3.     if (isAborted)
  4.         break;
  5.  
  6.     while (true)
  7.     {
  8.         if (filter.enterPressed == true)
  9.         {
  10.             break;
  11.         }
  12.  
  13.         if (filter.bCanceled == true)
  14.         {
  15.             isAborted = true;
  16.             break;
  17.         }
  18.     }
  19. }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Задержку при итерации по списку
« Ответ #8 : 30-08-2018, 12:23:27 »
В случае с текущим вопросом в каждом заходе при итерации списка элементов нужно создавать такой-же бесконечный while, в котором "ловить" и Enter и Esc и обрабатывать их по-своему
Хехе :) До такого костыля я не додумался. Да, так, наверное, будет работать. Но это извращение жуткое, ятд.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Задержку при итерации по списку
« Ответ #9 : 30-08-2018, 12:28:33 »
Но это извращение жуткое, ятд.
Ну я тоже считаю, что с окошком будет правильнее

Отмечено как Решение Atomohod 30-08-2018, 22:16:01

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Задержку при итерации по списку
« Ответ #10 : 30-08-2018, 14:57:22 »
Самый простой, на мой взгляд - это добавить в конце цикла пользовательский запрос Editor.Get<...>. Выбрать только тот, который больше подойдёт по ситуации (как вариант - Editor.GetKeywords) и правильно настроить.
Как-то так (на коленке, без проверок):
Код - C# [Выбрать]
  1. public static void FindPositionMark(Editor ed)
  2. {            
  3.     int desiredPos = GetDesiredPositionNumberFromUser();
  4.     List<Point3d> objectPos = GetBlockReferencesWithDesiredPosition(desiredPos);
  5.     for (int i = 0; i < objectPos.Count;)
  6.     {
  7.         Point3d posMark = objectPos[i];
  8.         AuxiliaryUtilities.ViewUtilities.ZoomExtents(posMark);
  9.         PromptKeywordOptions keyOpts = new PromptKeywordOptions("\nПерейти к: ");
  10.         if (i > 0)
  11.         {
  12.             keyOpts.Keywords.Add("Prev", "Предыдущему");
  13.         }
  14.         if (i < objectPos.Count - 1)
  15.         {
  16.             keyOpts.Keywords.Add("Next", "Следующему");
  17.             keyOpts.Keywords.Default = "Next";
  18.         }
  19.         else
  20.         {
  21.             keyOpts.Keywords.Default = "Prev";
  22.         }
  23.         keyOpts.Keywords.Add("Exit", "Выход");
  24.         keyOpts.AllowNone = true;
  25.         keyOpts.Message += keyOpts.Keywords.GetDisplayString(false);
  26.         PromptResult keyRes = ed.GetKeywords(keyOpts);
  27.         if (keyRes.Status != PromptStatus.OK || keyRes.StringResult == "Exit") break;
  28.         switch (keyRes.StringResult)
  29.         {
  30.             case "Prev":
  31.                 i--;
  32.                 break;
  33.             case "Next":
  34.                 i++;
  35.                 break;                  
  36.         }
  37.     }
  38.  
  39. }
  40.