Lemieux,Получается, что во втором варианте я обращаюсь из основного потока, если всё работает?
Обращение к AutoCAD API (любое - .NET/VisualLisp/VBA/ObjectARX) допустимо только из основного потока. Многопоточное обращение к AutoCAD запрещено. Точка!
Получается, что во втором варианте я обращаюсь из основного потока, если всё работает?Видимо да, хотя я не видел, чтобы это было где-то документировано. Но если вдруг, в какой-то ситуации это окажется нет так, то пользователя твоей программы сразу возникнут проблемы.
Обращение к AutoCAD API (любое - .NET/VisualLisp/VBA/ObjectARX) допустимо только из основного потока. Многопоточное обращение к AutoCAD запрещено. Точка!Что и требовалось доказать.
Если есть в самом деле сложная задача, то ее можно распараллелить. Просто надо считать данные из чертежа в свои структуры, обработать параллельно, не вызывая API, и потом уже сохранять результаты в чертеж в главном процессе. По моему опыту структуры из API и их методы можно вызывать из других потоков безболезненно (Point2d, Vector3d и т.п.) Еще ProgressMeter вызываю - ничего, не фаталит. Но конечно не объекты из транзакций получать.Зачем делать двойную работу? Сначала считывать, потом обрабатывать и потом всё это объединять? Я тут попробовал провести эксперимент. Думал получу все блоки из пространства модели, получу количество доступных потоков, разобью список на количество потоков и сделаю массив из Action с нужными мне действиями по чтению нужной информации из блоков и засуну эти Action в Parallel.Invoke. Но AutoCAD ругается, странно, что фича с Excel/Word работает.
Зачем вы опять экспериментируете?Потому что интересно.
1000 блоков - это мизер. Сейчас делал плагин для чистки чертежа после импорта pdf. Там по 350 тысяч объектов сразу читывать приходится. Панель свойств впадает в ступор. Но простой цикл чтения foreach без малейшей параллельности считывает это за 2 секунды. Что тут параллелить и зачем?Что считывает, блоки из пространства модели? Но мне надо работать с атрибутами блоков, которых в блоке может быть много.
Что считывает, блоки из пространства модели? Но мне надо работать с атрибутами блоков, которых в блоке может быть много.AutoCAD это хорошо оптимизированное однопоточное приложение при работе с БД чертежа. По опыту, производительности хватает на обработку/изменение данных.
мне надо работать с атрибутами блоков, которых в блоке может быть много.Ты можешь в основном потоке считать информацию из атрибутов в массивы/классы, обработать Parallel.Invoke и в основном потоке изменить атрибуты.
Ты можешь в основном потоке считать информацию из атрибутов в массивы/классы, обработать Parallel.Invoke и в основном потоке изменить атрибуты.Так я нигде не писал, что мне надо изменять атрибуты, я их считываю, но у меня 5 условий при считывании атрибутов. И в цикле происходит анализ всех атрибутов, а запись в нужные массивы происходит не из всех атрибутов, а только удовлетворяющих условиям.
а программа отрабатывает (модифицирует его полностью) за секундыДопустим у меня команда отрабатывает за 5 секунд, но был интересен сам факт распараллеливания и новой информации.
но у меня 5 условий при считывании атрибутов. И в цикле происходит анализ всех атрибутов, а запись в нужные массивы происходит не из всех атрибутов, а только удовлетворяющих условиям.
Допустим у меня команда отрабатывает за 5 секунд, но был интересен сам факт распараллеливания и новой информации.
Как только добавляем проверку id.IsValid - цикл начинает колбасить.Так и должно быть. Ведь для того, чтобы проверить корректность ObjectId, AutoCAD должен полезть в базу данных. id.IsNull очевидно проверяет на 0 равенство одно из полей, id.IsErased тоже вполне возможно считывает некое поле в самом ObjectId, не обращаясь к базе.