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
Название: 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 А вообще можешь попробовать вызвать
С 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 (т.е. тогда когда есть взаимодействие с пользователем).