Помогите с отменой действия программы! - Страница 3
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с отменой действия программы!

Помогите с отменой действия программы!

Ответ
Поиск в этой теме
Непрочитано 09.10.2007, 18:05
Помогите с отменой действия программы!
480725
 
Москва
Регистрация: 06.10.2007
Сообщений: 132

Несколько программ вызываются каждая из своего пункта меню и производят зацикленные операции. Хотя нормальное завершение и предусмотрено, велика вероятность, что пользователь прервет программу вызовом другого пункта меню.
В этои сдучае оператор (command"_.undo""_begin") остается незавершенным и приходится в обработчик ошибок ставить анализ системной переменной UNDOCNL, т.к. иначе отмена вообще блокируется
При эксплуатации выявились две проблемы:
1) Если обработчик ошибок вовремя не сработал, а такое случается иногда т.к. какие-то действия пользователей способны вызвать прерывание работы самого обраработчика, то оператор (command"_.undo""_end") запущенный не сразу после работы программы, а после выполнения, например, каких-то построений в Автокаде, приведет в случае отмены одновременную отмену и результатов программы и этих построений.
2) Возникает масса ложных необходимостей выполнения (command"_.undo""_end") т.к. обращение к любой команде Автокада в меню устанавливает в переменной UNDOCTL признак незавершенности группы отмены. Предположительно из-за этого резко возрастает количество неоходимых операторов отмены (значительно более одного на одну операцию или программу), при этом результпт работы программы отменяется все-таки одним оператором, а не по частям, просто много операторв отмены расходуются вхолостую.
Думаю, виноват все-таки АвтоКАД, но может кто-то нашел решение.
Помогите!
Просмотров: 10395
 
Автор темы   Непрочитано 10.10.2007, 11:29 Re: Помогите с отменой действия программы!
#41
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Цитата:
Сообщение от 480725
А vl-cmdf не поможет?
В данном случае в *error* замена (command ...) на (vl-cmdf ...) не поможет. Проблема в том, что при отказе (ESC или ^C в меню) срабатывает обработка ошибок, но флаг отказа не снимается и поэтому команды ни при помощи command, ни при помощи vl-cmdf не выполняются. В этом и заключается баг, о котором я писал раньше.
Я так и думал.. Просто отсек последние сомнения.
480725 вне форума  
 
Непрочитано 10.10.2007, 11:31
#42
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,432


Так я ж прошу не простой код, а тот, который порождает проблемы. Хотя дело хозяйское...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2007, 11:36 Re: Помогите с отменой действия программы!
#43
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
Совсем лоб об стенку прошибать не станем, но пару деньков еще постучим..
До встречи, послезавтра...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 11:45 Re: Помогите с отменой действия программы!
#44
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
Совсем лоб об стенку прошибать не станем, но пару деньков еще постучим..
До встречи, послезавтра...
Ку!
480725 вне форума  
 
Непрочитано 10.10.2007, 11:52
#45
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:

Цитата:
Hi Alexander,

This is very strange - the *error* function no longer appears to support the use of (command) (whether on its own or with arguments). I have submitted a change request for this functionality.

In the meantime, you can use a workaround as show in the attached file, using COM functions to call the commands you wish. It's not ideal, as these strings do not then respect CMDECHO, but it does function as you'd expect:

(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 10.10.2007, 12:02
#46
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
На всякий случай ответ Kean Walmsley (Autodesk Developer Technical Services) на мой запрос:

Цитата:
Hi Alexander,

This is very strange - the *error* function no longer appears to support the use of (command) (whether on its own or with arguments). I have submitted a change request for this functionality.

In the meantime, you can use a workaround as show in the attached file, using COM functions to call the commands you wish. It's not ideal, as these strings do not then respect CMDECHO, but it does function as you'd expect:

(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Я не силен в английском, но он, как видно предлагал какое-то решение.. Оно помогло?
480725 вне форума  
 
Непрочитано 10.10.2007, 12:12
#47
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Решение в последней строке. Т.е. в *error* вместо:
Код:
[Выделить все]
(command "_.undo" "_e" "_.u")
использовать:
Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e _.u "))
Недостаток - эхо в командной строке.
Александр Ривилис вне форума  
 
Непрочитано 10.10.2007, 13:59
#48
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от 480725
Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Я думаю многих, в т.ч. меня, заинтересует какие проблемы исчезают.
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен.
Не думаю, что так уж и многих это интересует - никаких тайн тут нет - всё описано в документации. Основное, это то, что vl-cmdf не передаёт на выполнение аргументы если они имеют некорректный тип и то, что она прерывается при возникновении ошибок выполнения команды и по Esc не в ошибку, а в тихий nil, что позволяет писать более безопасный код. А в сочетании с некоторыми приёмами, которые тут уже многократно упоминались, практически избавиться от использования *error*.
Alaspher вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:01
#49
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Александр Ривилис
Решение в последней строке. Т.е. в *error* вместо:
Код:
[Выделить все]
(command "_.undo" "_e" "_.u")
использовать:

Недостаток - эхо в командной строке.
В варианте Kean Walmsley (Autodesk Developer Technical Services)
сразу после закрытия группы выполняется и отмена этой группы. А обработчиу ошибок должен только закрывать группу, а не отменять ее. Хотя.. Интересная идея! Если мы прервали посредине группы отмены, т.е. заведомо отказавшись от завершения неразрывного действия, то зачем нам его начало.. Остается проблема, что undocnl >=8 бывает не не только при прерывании незакрытой группы отмены. А при выплонении любой команды АвтоКАДа из меню. В общем такое крутое решение надо обдумать.. Может вы и на этот вопрос знаете ответ?

К о л и т е с ь!

Попробовал видоизменить только не закрытие группы:

Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e "))
И все получилось! Проверял пока только в командной строке.. Но думаю и в *error* проблем не будет
Слава, слава AutoDesk-у, слава добрым докторам! И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
480725 вне форума  
 
Непрочитано 10.10.2007, 14:08
#50
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от 480725
И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
Это было больше года назад, все пояснения и уточнения лежат в открытом доступе, на форуме autocad.ru, правда сам форум пока лежит... Видимо, Денис в отпуске...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:14
#51
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Alaspher
Цитата:
Сообщение от 480725
Цитата:
Сообщение от Alaspher
К уже сказанному добавлю только то, что с появлением vl-cmdf о command надо забыть. Приличная часть проблем при этом просто исчезнет. Если код писался без использования некорректных приёмов, то можно сделать глобальную замену "command" -> "vl-cmdf" во всех исходниках (предварительно, конечно заархивировав их текущее состояние).
Я думаю многих, в т.ч. меня, заинтересует какие проблемы исчезают.
Пару - тройку, а лучше все, перечислите пожалуйста. Заранее благодарен.
Не думаю, что так уж и многих это интересует - никаких тайн тут нет - всё описано в документации. Основное, это то, что vl-cmdf не передаёт на выполнение аргументы если они имеют некорректный тип и то, что она прерывается при возникновении ошибок выполнения команды и по Esc не в ошибку, а в тихий nil, что позволяет писать более безопасный код. А в сочетании с некоторыми приёмами, которые тут уже многократно упоминались, практически избавиться от использования *error*.
Это шире и подробнее, чем в описании.
Я попробую ее в работе, а потом отвечу.. Обязательно.
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:20
#52
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от 480725
Цитата:
Сообщение от Александр Ривилис
Попробовал видоизменить только не закрытие группы:
Опечатка! Должно быть:
Попробовал видоизменить только НА закрытие группы:
480725 вне форума  
 
Непрочитано 10.10.2007, 14:38
#53
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,432


Цитата:
Сообщение от 480725
Попробовал видоизменить только не закрытие группы:

Код:
[Выделить все]
(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) (strcat (chr 27)(chr 27)"_.undo _e "))
Код:
[Выделить все]
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:43
#54
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Цитата:
Сообщение от 480725
И вам, вытянувшему у AutoDesk-а эту информацию! И поделившемуся ею со всеми!
Это было больше года назад, все пояснения и уточнения лежат в открытом доступе, на форуме autocad.ru, правда сам форум пока лежит... Видимо, Денис в отпуске...
Про Дениса не знаю, а форум - точно в отпуске!
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 14:49
#55
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Цитата:
Сообщение от 480725
[/code]
Код:
[Выделить все]
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
Неочевидно как это будет работать, если группа отмены открыта командой!
480725 вне форума  
 
Непрочитано 10.10.2007, 14:53
#56
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,432


А кто заставляет использовать команды? Еще же в самом начале сказали как поступать...
Код:
[Выделить все]
(defun mainfunc( / doc *error*)
(defun *error*(msg)
(vla-endundomark adoc)
(princ msg)
(princ)
)
(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
; Выполняемый код
(vla-endundomark adoc)
(princ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 15:34
#57
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
А кто заставляет использовать команды? Еще же в самом начале сказали как поступать...
Код:
[Выделить все]
(defun mainfunc( / doc *error*)
(defun *error*(msg)
(vla-endundomark adoc)
(princ msg)
(princ)
)
(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
; Выполняемый код
(vla-endundomark adoc)
(princ))
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
480725 вне форума  
 
Непрочитано 10.10.2007, 15:42
#58
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,432


Цитата:
Сообщение от 480725
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
И потом потратить неделю на внесение измененного варианта во все лиспы. А потом найти еще чего-то и снова тратить неделю. Не, я на такое не согласный...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2007, 15:58 Re: Помогите с отменой действия программы!
#59
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Елпанов Евгений
Вот тебе пример вызова моей старенькой программки, по отрисовке часиков и еще одного лиспика, чтоб защитить выполняемую программу от остановки. Попробуй прервать выполнение программы, т.е. остановить показ часиков, раньше, чем пройдет 120 сек...
Класс! Действительно, только что молотком по экрану не стучал, 120 секунд стоит. И часики красивые, не ожидал! Мелкие недочеты (стрелка секундная буксует, если не возить циферблат по экрану) списываем надавность разработки и связанную с ней возможную подмену версии, или вообще, на оригинальную задумку автора.
Но к тому, что о тебе известно, она не способна ничего прибавить.
Действительно, на фоне твоих достижений (и только на нем) - это - программка.

Только ведь прерывание придумано чтобы прерывать.
А обработчик прерываний должен восстановить среду. Т.к. Программы при вызове сами могут восстановить среду, а команды АвтоКАДа, не могут.
480725 вне форума  
 
Автор темы   Непрочитано 10.10.2007, 16:13
#60
480725


 
Регистрация: 06.10.2007
Москва
Сообщений: 132


Цитата:
Сообщение от Кулик Алексей aka kpblc
Цитата:
Сообщение от 480725
Я же писал. Программы уже есть. И во всех стоит command!
Речь не о написании новой системы, а о приспособлении старой к ошибке в АвтоКАДе. Переделывать все - быстро не получится. А обработчик прерываний - помучаемся, но разберемся и сделаем за пару дней!
И потом потратить неделю на внесение измененного варианта во все лиспы. А потом найти еще чего-то и снова тратить неделю. Не, я на такое не согласный...
Так я же тебя не заставляю. А мне лучше решить проблему быстро.
Т.к. проблема в ошибке Автокада, а не в лиспах. Они уже много поработали.. И все в них, в основном, уже нашли. Когда добрый Автодеск еще проблемки подкинет, тоже попытаемся за пару дней решить, а не за недели..
480725 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с отменой действия программы!

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск