Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alxd от 15-07-2016, 07:28:20

Название: Прервать выполнение длительной операции
Отправлено: Alxd от 15-07-2016, 07:28:20
При выполнении программы возможна ситуации, когда вычислений в цикле будет очень много. Сотни тысяч. Чтобы как-то информировать пользователя о процессе вычислений прикрутил progress. И сразу возникла мысль, а можно ли обработать нажатие Esc в цикле и прервать цикл в этом случае?
Название: Re: Прервать выполнение длительной операции
Отправлено: Вильдар от 15-07-2016, 08:18:46
Есть такой способ.
Код - C# [Выбрать]
  1.                     if (HostApplicationServices.Current.UserBreak())
  2.                     {
  3.                         break;
  4.                     }
На Esc реагирует.
Название: Re: Прервать выполнение длительной операции
Отправлено: Alxd от 15-07-2016, 09:48:48
Че т в моем случае не получилось. Вписал этот код в тело цикла, нарочно сделал его долгим. Хоть затыкайся в Esc, не прерывает цикл, пока не закончит, а вот когда цикл завершился прерывает выполнение команды полностью. Гадство. :(
Название: Re: Прервать выполнение длительной операции
Отправлено: Александр Ривилис от 15-07-2016, 10:51:29
http://through-the-interface.typepad.com/through_the_interface/2007/02/allowing_users_.html
http://adndevblog.typepad.com/autocad/2012/07/allowing-users-to-escape-from-long-operations-in-autocad-net.html
http://adndevblog.typepad.com/autocad/2013/02/return-to-command-prompt-when-escape-is-pressed-using-net.html
А вообще можешь попробовать вызвать
Код - C# [Выбрать]
  1. System.Windows.Forms.Application.DoEvents();
перед вызовом:
Код - C# [Выбрать]
  1. if (HostApplicationServices.Current.UserBreak())
  2. {
  3. //...
  4. }
Название: Re: Прервать выполнение длительной операции
Отправлено: Alxd от 15-07-2016, 12:14:50
С HostApplicationServices.Current.UserBreak() не получилось, а по рецепту Kean Walmsley все заработало. Спасибо!
Название: Re: Прервать выполнение длительной операции
Отправлено: Александр Ривилис от 15-07-2016, 23:12:19
С HostApplicationServices.Current.UserBreak() не получилось
Интересно в какой версии AutoCAD? Хочу перепроверить.
Название: Re: Прервать выполнение длительной операции
Отправлено: Alxd от 16-07-2016, 13:33:31
2015
Название: Re: Прервать выполнение длительной операции
Отправлено: Александр Ривилис от 16-07-2016, 13:50:12
Я проверил в 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 (т.е. тогда когда есть взаимодействие с пользователем).