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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ошибка 0xC0000005 (access violation) при импорте свойств динамических блоков

Ошибка 0xC0000005 (access violation) при импорте свойств динамических блоков

Ответ
Поиск в этой теме
Непрочитано 21.10.2010, 18:17 #1
Ошибка 0xC0000005 (access violation) при импорте свойств динамических блоков
Ax3
 
Programming, automation, CADs, GISs. "Теплоком"
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 297

Привет, братья по каду!

Проблема такая.
Экспортирую значения лукапов и прочих свойств динамического блока в файл, затем читаю файл и пытаюсь в новое вхождение дин.блока импортировать прочитанные из файла значения свойств.

Все проходит нормально, пока блоки несложные и время импорта не превышает 5...15 с. В сложные же блоки (порядка 20 лукапов и 100 полей, ссылающихся на лукапы) импорт происходит около 30...40 с. И вот где-то на середине процесса выдается ошибка 0xC0000005 (access violation), иногда добавляется "warning: unwind skipped on exception". При отладке убедился, ошибка выдается при выполнении
Код:
[Выделить все]
(vlax-put-property
  vla-dyn_blk_props_list_item_ ; - указатель на свойство дин. блока (lookup)
  'value
  (vlax-make-variant
    prop_val_ ; - значение из списка
    vlax-vbString ;not sure about definitely string, but most likely
  )
)
.
Попытка отлова ошибок
Код:
[Выделить все]
(setq
  prop_set_err_
    (vl-catch-all-apply
    'vlax-put-property
    (list
      dbpio__mf__vla-dyn_blk_props_list_item_ ; - указатель на свойство дин. блока
      'value
      (vlax-make-variant
        prop_val_
        vlax-vbString ;not sure about definitely string, but most likely
      )
    )
  )
)
(if
  (/=
    (vl-catch-all-error-p dbpio__mf__vla-dyn_blk_props_list_item_prop_set_err_)
    nil
  )
  ;then:
  (progn
    (alert "<сообщение>")
  )
)
абсолютно ничего не меняет. То есть ошибки как бы и нет.
При этом значения лукапов все-таки устанавливаются в нужные, и собственно все отрабатывает нормально. И шут бы с ней, с этой ошибкой.
НО.
Иногда выдача ошибки 0xC0000005 сопровождается Fatal Error. И вот это уже неприятно.
Также заметил, что все вышеописанное происходит только при открытом окне "Properties". Такое впечатление, что на двадцать какой-то секунде импорта оно (окно свойств) пытается лезть в блок, занятый программой импорта.
Попытка программно закрывать окно свойств перед началом цикла импорта ничего не дала. Видимо, после закрытия окна свойств все-таки оно пытается лезть в мой блок либо в командную строку, и, видимо, требуется какой-то разрыв в выполнении моей программы, чтобы освободить кад и дать ему то ли обновиться, то ли хз чего еще сделать.

Посоветуйте, плз, что можно попробовать сделать для исключения такой ошибки?

P.S.
Ссылки
1. Supermax в теме "Работа с реакторами"
http://forum.dwg.ru/showthread.php?p=605271#post605271
описывает похожую ситуацию, но там речь идет об организации разрыва между изменением блока пользователем и запуском реактора на это изменение, чтобы освободить блок/командную строку и дать окну свойств сделать все, чего оно так добивается.
2. Елпанов Евгений "ошибки лисп интерпретатора 2008+"
http://forum.dwg.ru/showthread.php?t...ght=0xC0000005
Тут пока ничего не могу сказать.
3. mmax "Виснет компьютер при обработке длинных списков"
http://forum.dwg.ru/showthread.php?t...ght=0xC0000005
Очень похожая ситуация.
Впихнуть прогресс бар в свою программу, как советуют Елпанов Евгений и Александр Ривилис попробую, но пока не очень на это надеюсь.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 21.10.2010 в 18:31.
Просмотров: 6259
 
Непрочитано 21.10.2010, 18:34
#2
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Советую разбить весь процесс записи на части с сохранением достигнутого при выполнении каждой части и выводом информации о последнем действии (да хоть бы в файл).
Supermax вне форума  
 
Непрочитано 21.10.2010, 18:51
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,776
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Ax3 Посмотреть сообщение
Также заметил, что все вышеописанное происходит только при открытом окне "Properties".
Как временное решение: Вызывай команду _propertiesclose и принудительно закрывай окно свойств
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 21.10.2010, 19:06
#4
Александр Ривилис

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


Если установлен GeomProps - удали, и убедись, что это не из-за него.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 22.10.2010, 12:27
#5
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>>VVA
Пробовал. Закрытое из моей программы окно свойств все равно мешает. То есть надо, чтобы окно свойств было закрыто ДО запуска моей программы. А это сложно.
>>Александр Ривилис
{исправлено} Если вы имеете в виду вашу программу подсчета площади - то нет, не установлена. PlTools есть, но вряд ли они могут мешать?
>>Supermax
У меня ход всего процесса отображается (print)-ами. Это не то? Почему в файл? Просто для того, чтобы совершить операции ввода-вывода?
Цитата:
с сохранением достигнутого при выполнении каждой части
- тоже имеешь в виду в файл? Или сохранять чертеж после выполнения каждой части?

Спасибо за отклики!
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 22.10.2010 в 12:40.
Ax3 вне форума  
 
Непрочитано 22.10.2010, 12:42
1 | #6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,776
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Ax3, А если сделать так. Делается Команда-обертка, которая будет вызываться пользователями. Она через vla-sendcommand сначала посылает _propertiesclose
потом через Sendcommand твою уже рабочую команду
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.10.2010, 10:21
#7
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>> VVA
Спасибо за подсказку. Вариант с (vla-sendcommand) работает.
К сожалению, такой вариант не очень хорош для пользователя, но все же лучше, чем Fatal Error в самый разгар работы :-)

И все ж таки - должно же быть решение без закрытия окна свойств?

P.S.
Код:
[Выделить все]
(vlax-invoke-method (vlax-get-acad-object) 'update)
не помогает. Может, есть в лиспе что-нибудь типа как в Делфи
Код:
[Выделить все]
Application.ProcessMessages
?

P.P.S. {2010.10.27 11.40.25}
Хм. Что интересно, если перед запуском цикла импорта значений лукапов окно свойств закрыть "по-пользовательски", то в первый раз импорт отрабатывается все равно с ошибками, второй и далее - нормально.
А в варианте с закрытием окна свойств через (vla-sendcommand) цикл отрабатывается без ошибок с первого раза.
Но это так, к слову.

Только что попробовал использовать (mdelay 100) (функция mdelay использована после загрузки ProgressBars2007.arx, скачал отсюда: http://www.maestrogroup.com.ua/support/ProgressBars.zip) после каждого (vlax-put-property <лукап> 'value <значение>). Не помогает.
>> Александр Ривилис.
Не могли бы Вы подсказать, что делает функция (mdelay)? В смысле какой/какие методы используются для реализации ожидания?
И еще.
Благодаря чему ProgressBar решает проблему обработки сообщений кадом во время длительных операций? Что в нем еще такое используется? Какие-то методы объекта Application? Спрашиваю потому, что, может быть, я смогу использовать именно такие методы вместо всего ProgressBar'а?

Блин, что это вообще за объект такой - окно свойств? Ни системных переменных с ним никаких не связано, ни программных методов работы с ним никаких нет, непонятно даже, как узнать, открыто оно в данный момент или нет... А то бы остановился на варианте с vla-sendcommand, только после отработки восстанавливал бы окно свойств, если оно было открыто у пользователя. {Добавлено 2010.12.24:} недавно узнал. OPMSTATE
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 24.12.2010 в 11:04.
Ax3 вне форума  
 
Непрочитано 27.10.2010, 13:28
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А ты попробуй не закрывать окно свойств, а запускать свои действия через вот это:
http://forum.dwg.ru/showthread.php?t=58328
Supermax вне форума  
 
Автор темы   Непрочитано 27.10.2010, 14:27
#9
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>> Supermax
Ммм... Если я все правильно понял, то я себе на AutoIT уже накатал некое подобное внешнее приложение, осуществляющее вызов лисповой функции в каде через SendCommand (тоже использую COM). Но в данном случае я не вижу разницы между вызовом моего цикла от пользователя и вызовом того же цикла из внешнего приложения. Цикл-то все равно долгий, и от того, откуда он вызван, ситуация, думаю, не меняется.
Впрочем, не думаю, а уже проверил - не меняется. Еще раз подчеркну - это если я правильно понял идею твоей программы, Supermax.

Подумал о таких вариантах использования внешнего приложения:

1. Вот если бы вызывать именно (vlax-put-property) из внешнего приложения - это, полагаю, помогло бы. Но делать внутри цикла вызов внешнего приложения, которое потом по освобождении када выполняет операции, являющиеся телом цикла - ... думаю, понятно, что не вариант. от 10 до 125 (в зависимости от количества дин.свойств дин.блока) экземпляров внешнего приложения никому не нужны.

2. Организовывать весь цикл во внешнем приложении и уже в нем перед каждым вызовом функции (vlax-put-property) через sencommand ожидать освобождения када - наверно, самый нормальный вариант, но очень не хочется выносить лисповый код (то есть весь алгоритм) в другой язык программирования. И вообще не хочется ковырять кадовские объекты "извне". Слишком уж это подозрительно - перебирать движок через выхлопную трубу...

Других вариантов использования внешнего приложения я не придумал.

В любом случае, спасибо за отклик!

P.S.
Кстати, заметил, что иногда (редко) код ошибки не как в заголовке этой темы, а 0xC0000096, описание все то же - access violation
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 27.10.2010 в 15:11.
Ax3 вне форума  
 
Непрочитано 28.10.2010, 14:21
#10
Александр Ривилис

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


Цитата:
Сообщение от Ax3 Посмотреть сообщение
>> Александр Ривилис.
Не могли бы Вы подсказать, что делает функция (mdelay)? В смысле какой/какие методы используются для реализации ожидания?
И еще.
Благодаря чему ProgressBar решает проблему обработки сообщений кадом во время длительных операций? Что в нем еще такое используется? Какие-то методы объекта Application? Спрашиваю потому, что, может быть, я смогу использовать именно такие методы вместо всего ProgressBar'а?
Mdelay выполняет задержку на заданное число миллисекунд. И все. Думаю, что в твоем случае нужно использовать другую функцию:
Код:
[Выделить все]
//////////////////////////////////////////////////////////////////////////
// (OnIdleAcad [<TimeInt>]) - эта функция при длительных вычислениях в 
// lisp-функциях позволяет AutoCAD обработать свою очередь сообщений
// (например, обновить содержимое окна редактора, отреагировать
// на движения мыши и т.д.)
На lisp'е аналога ее сделать нельзя.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 29.10.2010, 20:27
#11
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>> Александр Ривилис
Хорошо. Я загрузил ProgressBars2007.arx, но самого прогрессбара не использовал, просто попытался в цикле после каждого (vla-put-property) выполнять (onidleacad 100). Не помогло. Значит ли это, что надо обязательно использовать (отображать) прогрессбар? Или если не помогло - значит не помогло?
П.С. Извините за вопросы, просто руки не доходят попробовать.
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 29.10.2010, 21:44
#12
Александр Ривилис

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


Цитата:
Сообщение от Ax3 Посмотреть сообщение
Или если не помогло - значит не помогло?
Именно так. Только сначала попробуй вместо (onidleacad 100) поставить (onidleacad 0.1)
Иначе обновление у тебя будет раз в 100 секунд.
Александр Ривилис вне форума  
 
Непрочитано 29.10.2010, 23:38
#13
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ax3, по-моему ты слегка "заблудился в трех соснах".
1. Читать блок и записывать в него новые значения, а потом опять читать, а окно "свойства" в это время обнавляет свои данные, а ты уже новые значения туда пихаешь - не комильфо!
2. Ты уже чувствуешь, что все твои беды крутятся вокруг командной строки? А почему? А кому она еще нужна?
3. А ты send-command из дочернего процесса вызываешь, из собственного, или из независимого?
Supermax вне форума  
 
Автор темы   Непрочитано 09.11.2010, 17:55
#14
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>>Supermax
Ты явно на что-то намекаешь, дружище :-)
Вот как я выкрутился по совету VVA.
На кнопку, которой пользуется пользователь. повешена функция:
Код:
[Выделить все]
;(c)Danilov_AS_aka_`Hawk`
;По совету VVA в теме http://forum.dwg.ru/showthread.php?p=645324&posted=1#post645324
;_2010.10.27
;
(defun
  Dyn_block_props_i_w_clos_props_wnd
  (
  /
  )
  ;(setq g__ss_ (cadr (ssgetfirst)))
  (setq g__ss_ (ssget "_i"))
(alert "Окно свойств будет закрыто.\nПростите за неудобство")
  (vla-sendcommand
    (vlax-get-property
      (vlax-get-acad-object)
      'activedocument
    )
    "_.propertiesclose\n"
  )
  (vla-sendcommand
    (vlax-get-property
      (vlax-get-acad-object)
      'activedocument
    )
    (strcat
      "(sssetfirst nil g__ss_)"
      "\n"
    )
  )
  (vla-sendcommand
    (vlax-get-property
      (vlax-get-acad-object)
      'activedocument
    )
    (strcat
      "(Dyn_block_props_io__main_func1 " (chr 34) "in" (chr 34) ")" ; - собственно вызов импорта значений свойств
      "\n"
    )
  )
)
__________________
На LISPе можно мыслить!
Ax3 вне форума  
 
Непрочитано 10.11.2010, 08:04
#15
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 972


Ax3, а можешь приложить свой блок? Ну так, для интересу.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 24.12.2010, 09:28
#16
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


Лиcпер, выложить блок здесь не могу, потому что он корпоративный, а переделывать долго. Однако щас в личку тебе попытаюсь кинуть.
НО это уже не так важно.
---------------------------------------------------------------------
Решение вопроса, похоже, оказалось примитивно простым (только вчера выяснил). Приведенный выше код работал не благодаря (vla-send-command), а благодаря (alert)-у, который - внимание! - снимает выделение с блока. Таким образом, ключом оказалось снятие выделения с блока, видимо, чтобы окно свойств не лезло в него в процессе выполнения импорта свойств.
Добавил в свою программу импорта свойств всего одну строчку в начале:
Код:
[Выделить все]
(sssetfirst nil nil)
- и описанная в заголовке проблема исчезла. Так что (vla-send-command) уже не нужен.
Проверил несколько раз на почти сотне экземпляров своего блока - ошибки не было ни разу.

(Каждый раз, когда решение оказывается таким простым, не знаю - радоваться ли его нахождению или печалиться своей тупости... )

Всем огромное спасибо за участие!
>>VVA похоже, именно твой вариант натолкнул-таки меня правильное решение.
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 24.12.2010 в 09:49.
Ax3 вне форума  
 
Непрочитано 24.12.2010, 09:31
#17
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 972


Я как-то видел код, который работал только в одном случае - при наличии в конце строки (princ)
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 24.12.2010, 09:43
#18
Ax3

Programming, automation, CADs, GISs. "Теплоком"
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 297


>>Лиспер
(удалено)
Что-то в личке не нашел, как вложения делать, поэтому туда выслал пароль к архиву.
Предвидя возможные вопросы, сразу замечу, что без реактора, который я вешаю на этот блок, он почти бесполезен. Реактор занимается "авторегенерацией" блока, изменением цвета и высоты текстов и т.п.

Да, никогда не знаешь, без какой мелочи твоя программа будет глючить :-) Тем интереснее, наверно :-)

{_2011.03.01_18.17.07}
К слову.
Обнаружил, что вот этот код:
Код:
[Выделить все]
(vla-objectidtoobject (vla-get-activedocument (vlax-get-acad-object)) 1234)
вызывает ту же ошибку в AutoCAD Architecture 2009 en x64 (вместо 1234 - любое число, ошибка возникает, когда в чертеже нет объекта с указанным id).
В AutoCAD 2008 en x86 такой ошибки не возникает, там выдаётся штатная ошибка
"; error: Automation Error. Description was not provided."
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 12.03.2011 в 11:21.
Ax3 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Ошибка 0xC0000005 (access violation) при импорте свойств динамических блоков

Еврокод EN. Базовый Видеокурс
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при печати: Unhandled Access Violation Reading 0x0004 Exception at 34674a70h Major4uk AutoCAD 8 09.03.2010 15:58
Несоответствие результатов в Лире s.vas Лира / Лира-САПР 19 11.11.2009 07:31
ФАТАЛЬНАЯ ОШИБКА: Unhandled Access Violation Reading 0x8e545c84 Exception at 6352a39eh? jackalll Вертикальные решения на базе AutoCAD 20 16.12.2008 13:55
Автозагрузка приложения до загрузки чертежа Ax3 Программирование 14 15.02.2008 23:29
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47