|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как организовать досрочный выход из цикла?
инженер-дефектоскопист
Санкт-Петербург
Регистрация: 08.12.2006
Сообщений: 58
|
||
Просмотров: 11735
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Нажатие Esc по идее как раз прерывает выполнение функции. Я на сайте у себя разбирал кое-что по этому поводу.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
в функции grread есть возможность отслеживать не только перемещения курсора, но и нажатия клавиш на клавиатуре...
Достаточно сделать проверку возвращаемого кода из функции.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Елпанов Евгений: Да, но пока клавиша на клавиатуре не будет нажата, программа выполняться не будет. А нужно, чтоб вычисления не прерывались.. Код в первом посте наглядно иллюстрирует, что лисп останавливает выполнение в ожидании любого ввода пользователя (ввода с клавиатуры, преремещение курсора мышой и тп).
Кулик Алексей aka kpblc меня правильно понял: задача сделать экстренный выход из вычислений по нажатию клавиши. Esc прерывает выполнение команды автокада, но не прерывает выполнение лисп вычислений. Esc срабатывает если в коде есть grread. Но grread в ожидании ввода пользователя останавливает вычисления..( |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
[N.S], так ты полностью задачку опиши. Возможно, все можно будет сделать совсем по-другому, привлекая пользователя только для экстренного прерывания выполнения. Опять же, намекаю на vl-catch-* функции
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 20.01.2011 в 14:36. Причина: Актуальная ссылка на afralisp |
|||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Цитата:
Задача про проверку целостности трассы трубопровода. Трубопровод состоит из 2М полилиний, которые либо имеют смежные точки, либо пересекаются, либо никак не связаны. Берется первая полилиния и от нее по цепочке строится трасса. Полилиний тысячи, вычисления до нескольких минут. А пользователь может понять, что ошибся в выборе начального элемента трассы и захочет вычисления прервать. Код написан, код длинный, код на работе - привести его здесь не могу. Думаю как организовать экстренное прерывание.. Кулик Алексей aka kpblc про vl-catch-* что ты имел ввиду? И вообще: какие есть пути решения? VVA: А исходник acet-sys-keystate где найти можно? Как я понял эта функция использует GetKeyState() Windows User Interface, и до нее наверное можно через (vlax-get-or-create-object .. ) добраться? Последний раз редактировалось [N.S], 19.01.2010 в 12:26. Причина: добавление |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
Цитата:
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Создаю функцию, выполняющуюся "вечно":
Код:
Код:
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Разобрался.
Pastor, если выполняемая lisp функция задана в другом пространстве имен, то прервать ее по Esc невозможно. Откомпилировав вот это в VLX приложение (выбрав New Application Wizard - Expert - ... - Separate Namespace - ...) Код:
Код:
Корректный экстренный выход нужно предусмотреть самому. Вопрос КАК? |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406
|
А если пространства имен не разделять? По идее код, аналогичный
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Кулик Алексей aka kpblc Спасибо, протестировал предложенный код:
1) Если не компилировать: Цитата:
Цитата:
Из 1) и 2) получается, что vl-catch-all-apply не ловит прерывание цикла по Esc. (Тогда бы перед ; entering keyboard break loop должно было вывестись ** error : ) 3) Прервать цикл функции в другом пространстве имен по Esc по прежнему невозможно. Вывод: не исползовать разделенное пространство имен (не хотелось бы), или использовать acet-sys-keystate из ExpressTools, как предложил VVA, или самому поднимать COM сервер чтоб задействовать GetKeyState() , как предлагают здесь http://forum.dwg.ru/showthread.php?t=46137 Есть еще варианты прервать лисп функцию из разделенного пространства имен? |
|||
![]() |
|
||||
Цитата:
Вот пример ожидающий нажатия любой клавиши на клавиатуре: Код:
Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Елпанов Евгений:
Цитата:
|
|||
![]() |
|
||||
Цитата:
Если нет никаких движений, то каждый цикл проверки отнимает чуть меньше половины секунды... Код:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Елпанов Евгений
Цитата:
Вот измененный вариант кода верхнего поста, который выводит текущее значение счетчика в строку состояния (вроде так называется, то куда (grtext -1 ..) шлет). Запустив, его можно наблюдать, как каждое нажатие или движение мыши увеличивает счетчик на единицу (мгновенно). При этом если ничего не жать и не двигать, счетчик не изменяется. следовательно, лисп не выполняется, а ждет ввода пользователя. Если шевелить мышью, то видно что счетчик изменяется оч. быстро, значит цикл проверки занимает много меньше пол секунды. Код:
|
|||
![]() |
|
||||
Цитата:
Посмотри видео, как это выглядит у меня. Сверху, я специально поставил часики, чтоб можно было видеть текущее время и сравнить скорость обновления...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
инженер-дефектоскопист Регистрация: 08.12.2006
Санкт-Петербург
Сообщений: 58
|
Елпанов Евгений Верю) У меня 2006 и 2008 англиские версии автокада - и счетчик не меняется. Впрочем, не может ли быть что какое-то устройство таки у тебя дает регулярный сигнал? И все же скорость опроса (grread) на порядки выше пол секунды..
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Как именно настроить параметры нового чертежа? | Макс_Северянин | AutoCAD | 31 | 01.09.2010 10:16 |
Как организовать событие "Закончилась минута"? | kos | Программирование | 21 | 16.03.2009 12:31 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
Как организовать линейный шарнир в Скаде | SkiFF | SCAD | 4 | 26.03.2006 14:50 |