Загрузка и выгрузка файла .arx с помощью LISP

У меня есть несколько приложений .arx для AutoCAD. Некоторые из этих приложений основаны на меню, а другие — на командной строке. Теперь то, что я пытаюсь сделать, это,

  1. Загрузите приложение .arx,
  2. запустить его, а затем
  3. выгрузите его, как только приложение .arx запустит команду LISP. Приложения .arx запускаются, когда пользователь щелкает предоставленные вкладки. Приложения .arx написаны на VC++.

Теперь у меня есть файл lisp, который загружается, когда пользователь запускает AutoCAD. В файлах lisp я объявил эти функции для различных приложений .arx;

(defun c:XYZ_program() (command) (command) (arxload "C:/ABC/XYZ.arx") (command "XYZ_program") (arxunload "XYZ.arx"))

Он отлично работает для программ, которым требуются входные данные из форм на основе меню, но сообщает об ошибке при выгрузке xyz.arx для программ, которым требуется ввод командной строки.

Мне было интересно, есть ли в LISP какие-либо команды, которые гарантируют, что arxunload "XYZ.arx" будет выполняться только один раз (команда "XYZ_program").

Я не уверен, как подойти к этой проблеме. Любая помощь с тем же будет принята с благодарностью.

Код, который я сейчас использую, это ;

(
  defun c:XYZ_program() (command) (command)
   (arxload "C:/Example/Folder/XYZ.arx") 
   (command "XYZ_program") 
   ads_queueexpr( (arxunload "XYZ.arx") ) 
)

person JNL    schedule 11.07.2013    source источник
comment
Это не имеет ничего общего с Visual-C++   -  person David Ching    schedule 12.07.2013
comment
Приложения @DavidChing ObjectArx написаны на VC++. Поэтому я думаю, что есть способ, с помощью которого мы можем достичь цели разгрузки приложения .arx. Разработчики, работающие с VC++ и ObjectARX, будут лучше разбираться в этом.   -  person JNL    schedule 12.07.2013


Ответы (2)


Из вашего вопроса неясно, но похоже, что модуль нельзя выгрузить, потому что он активно выполняет команду, ожидающую ввода пользователя. Итак, я думаю, вы спрашиваете, как отложить выгрузку до завершения выполнения команды. Ответ на этот вопрос заключается в использовании ads_queueexpr() для постановки в очередь функции (arxunload "XXX") из самой команды.

Однако вы создаете себе гораздо большие проблемы, пытаясь выгрузить модуль. Выгрузка занимает время, так что это наверняка не поможет производительности. Правильное решение вашей проблемы — не выгружать свои модули и оставить выгрузку AutoCAD.

person Owen Wengerd    schedule 15.07.2013
comment
Спасибо за ваш ответ, Оуэн. Что касается производительности, я прочитал в документации Object Arx, что выгрузка приложения .arx действительно помогает повысить производительность, поскольку они сохраняются в памяти. В настоящее время у нас загружено около 25 приложений .arx, поэтому мы движемся в этом направлении. Также, когда мы пытаемся обновить пользователей, пользователь должен закрыть приложение (AutoCAD) по мере загрузки arx. Так что было просто любопытно, поможет ли нам разгрузка в обоих сценариях. - person JNL; 15.07.2013
comment
Я вставил команду LISP, которую я использую в настоящее время, с ads_queueexpr() в вопросе, но она все еще не работает. Мне интересно, правильно ли я его использую? Спасибо - person JNL; 15.07.2013
comment
Документация неверна. Выгрузка повредит производительности и не поможет с памятью. Загруженные модули не сохраняются в памяти, если память не свободна или код не запущен. Тот факт, что выгрузка сократит общее время, в течение которого модуль не может быть обновлен, все же не гарантирует, что горячие обновления возможны в любой момент времени, поэтому я думаю, что это очень ограниченное преимущество. Есть более надежные решения для отправки обновлений. - person Owen Wengerd; 15.07.2013
comment
Спасибо, Оуэн, я обязательно учту ваши замечания, а также был бы признателен, если бы вы просто взглянули на код, который я написал с помощью ads_queueexpr(). Это все еще не работает, правильно ли я это реализую? -------------------------( defun c:XYZ_program() (команда) (команда) (arxload C:/Example/Folder/XYZ.arx ) (команда XYZ_program) ads_queueexpr( (arxunload XYZ.arx)) ) - person JNL; 15.07.2013
comment
ads_queueexpr() — это функция C. Она принадлежит вашей реализации команды XYZ_program, а не коду lisp, который вызывает эту команду. - person Owen Wengerd; 15.07.2013
comment
Хорошо, спасибо за это. Есть ли какая-либо функция, которую можно использовать в LISP, чтобы добавить ее в очередь или иметь зависимость для ожидания полного выполнения предыдущей команды? Я совершенно новичок в LISP и никогда не использовал его раньше. Мне удалось написать вышеуказанную функцию, и я борюсь с текущей проблемой. - person JNL; 15.07.2013
comment
В настоящее время я использую --› ads_queueexpr(_T((выгрузить \Remove_Letter.arx\) )); в моей программе VC++ в конце программы VC++, но когда я запускаю ее в AutoCAD, она выполняет программу и при выгрузке говорит: Неизвестная команда ARX). Буду признателен за помощь в этом. - person JNL; 15.07.2013
comment
Спасибо, Оуэн. Решение, данное вами, сработало. Цените многое. - person JNL; 16.07.2013
comment
Я даже не думал об этом. Я несколько раз использовал queueexpr в С#. Рад, что вы, ребята, поняли это. - person Trae Moore; 17.07.2013
comment
@owen, ты должен опубликовать свой ответ как ответ, чтобы другие могли увидеть правильный ответ, и ты мог получить баллы, приятель. - person Trae Moore; 17.07.2013

http://docs.autodesk.com/ACD/2013/ENU/index.html?url=files/GUID-3FF72BD0-9863-4739-8A45-B14AF1B67B06.htm,topicNumber=d30e502824

(defun c:Load()
    (arxload "the\\file\\path")
    ; run the app
)

Попробуй это:

(arxload "C:/ABC/XYZ.arx" nil) 

(defun c:XYZ_program() 
    (command) 
    (command)
    (command "XYZ_program")
    (arxunload "XYZ.arx" nil) 
);

Удачи.

person Trae Moore    schedule 12.07.2013
comment
Большое спасибо, Трей, за ссылку, ценю это. Я как бы знаю команды для загрузки и выгрузки, но моя проблема в другом. Я использую следующую команду (defun c:XYZ_program() (command) (command) (arxload C:/ABC/XYZ.arx) (command XYZ_program) (arxunload XYZ.arx) ), но всякий раз, когда программе XYZ требуются входные данные из командной строке, arxunload(XYZ.arx) запускается перед ней и отображает сообщение об ошибке, а затем программа XYZ работает нормально. Я хочу, чтобы XYZ.arx сначала выполнялся, а затем запускался unload(XYZ.arx). - person JNL; 12.07.2013
comment
Зачем вам его разгружать? - person Trae Moore; 12.07.2013
comment
Я не могу точно вспомнить, какой именно, но когда вы закрываете чертеж или приложение, он удаляется автоматически. - person Trae Moore; 12.07.2013
comment
Я хочу динамически загружать программы, когда пользователь выбирает программы, а затем выгружать их после завершения. - person JNL; 12.07.2013
comment
Это может быть только я, но я не вижу необходимости выгружать его, когда он позаботится об этом за вас OnClose. - person Trae Moore; 12.07.2013
comment
Я читал в документации ObjectArx. Таким образом, динамическая загрузка .arx и их выгрузка помогают повысить производительность, особенно когда файлы arx тяжелые. Так что я с нетерпением ждал этого. Я могу загрузить их динамически, но проблема с выгрузкой только для arx. которые требуют ввода командной строки. Для ввода через меню он работает нормально, как и предполагалось. - person JNL; 12.07.2013
comment
Может быть, программа командной строки VC++ имеет окно командной строки, которое не закрывается, поэтому возникает ошибка выгрузки? Если вы создаете программу VC++, указав компоновщик вариант /SUBSYSTEM:WINDOWS - person David Ching; 12.07.2013
comment
Это не сработало, Трей. Спасибо за всю помощь. Ценить это. - person JNL; 12.07.2013
comment
@DavidChing Я немного смущен, когда вы упомянули окно командной строки? В настоящее время программа VC++ использует ввод командной строки AutoCAD. - person JNL; 12.07.2013
comment
Я не знаком с AutoCad или этими программами arx. Но вы сказали, что программы VC++, которые использовали меню, выгружались нормально, но не те, которые получали ввод из командной строки. Если вы создаете консольное приложение VC++ (/SUBSYSTEM:CONSOLE), когда вы запускаете его из Проводника, оно запускается в черном окне командной строки. Это отличается от приложения с графическим интерфейсом с меню (/SUBSYSTEM:WINDOWS), которое не запускается в черном окне командной строки. Поэтому я предложил вам создать консольную программу как программу с графическим интерфейсом (/SUBSYSTEM:WINDOWS), поскольку затем она может выгружаться так же, как и другие. - person David Ching; 12.07.2013
comment
@DavidChing В настоящее время я использую (/SUBSYSTEM:WINDOWS) для всех программ. Как вы думаете, что еще мы должны рассмотреть? - person JNL; 12.07.2013
comment
Если вы запускаете программы из проводника вместо AutoCad, они работают правильно? - person David Ching; 12.07.2013
comment
@TraeMoore Трей, если вы не возражаете и считаете этот вопрос важным, не могли бы вы проголосовать за него. Моя репутация сейчас всего 10, поэтому я не могу редактировать ответы. Я был бы очень признателен. Спасибо - person JNL; 13.07.2013
comment
@TraeMoore Я получил ответ. Оуэн выше предложил правильный путь для получения решения. Спасибо за вашу помощь. - person JNL; 16.07.2013