Прервать выполнение длительной операции

Автор Тема: Прервать выполнение длительной операции  (Прочитано 4686 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
При выполнении программы возможна ситуации, когда вычислений в цикле будет очень много. Сотни тысяч. Чтобы как-то информировать пользователя о процессе вычислений прикрутил progress. И сразу возникла мысль, а можно ли обработать нажатие Esc в цикле и прервать цикл в этом случае?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Есть такой способ.
Код - C# [Выбрать]
  1.                     if (HostApplicationServices.Current.UserBreak())
  2.                     {
  3.                         break;
  4.                     }
На Esc реагирует.

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Че т в моем случае не получилось. Вписал этот код в тело цикла, нарочно сделал его долгим. Хоть затыкайся в Esc, не прерывает цикл, пока не закончит, а вот когда цикл завершился прерывает выполнение команды полностью. Гадство. :(

Отмечено как Решение Alxd 15-07-2016, 12:14:55

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
« Последнее редактирование: 15-07-2016, 11:23:36 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
С HostApplicationServices.Current.UserBreak() не получилось, а по рецепту Kean Walmsley все заработало. Спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
С HostApplicationServices.Current.UserBreak() не получилось
Интересно в какой версии AutoCAD? Хочу перепроверить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я проверил в AutoCAD 2016 код отсюда: http://adndevblog.typepad.com/autocad/2013/02/return-to-command-prompt-when-escape-is-pressed-using-net.html
Код не сработал. Да и врядли мог сработать, так как время задержки там 10 миллисекунд в цикле из 100 итераций. Итого нужно было бы успеть нажать на ESC за секунду после запуска команды. Я увеличил цикл до 1000 и иногда (но крайне редко) этот код у меня начал срабатывать. Так что думаю, что ты прав и пользоваться им не следует. Скорее всего  HostApplicationServices.Current.UserBreak() устанавливается в true только после после вызовов Editor.GetXXX (т.е. тогда когда есть взаимодействие с пользователем).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение