AutoCAD Automation: как правильно программно прервать Utility.GetPoint (выполняется в другом потоке)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCAD Automation: как правильно программно прервать Utility.GetPoint (выполняется в другом потоке)

AutoCAD Automation: как правильно программно прервать Utility.GetPoint (выполняется в другом потоке)

Ответ
Поиск в этой теме
Непрочитано 16.08.2011, 11:14 #1
AutoCAD Automation: как правильно программно прервать Utility.GetPoint (выполняется в другом потоке)
IvanShkuropadsky
 
Регистрация: 19.07.2011
Сообщений: 5

Всем здравствуйте!
Картина следующая (AutoCAD 2007 ActiveX Automation, C# .NET 2008).

_acad - существующий объект, имеющий связь с AutoCAD и активным документом.
Он реализует метод AddLine интерактивно - через вызовы Utility.GetPoint() и ModelSpace.AddLine()

Что иметь возможность прервать выполнение метода, решил поступить следующим образом:
- Пусть данный метод выполняется в отдельном потоке.
- После запуска потока отображается диалоговое окно с кнопками "ОК" (просто закрывает окно) и "Отмена".
- Если кнопка "Отмена" нажимается во время выполнения Utility.GetPoint(), то поток прерывается методом Thread.Abort().
Цитата:
// создание потока и его запуск
Thread acadThread = new Thread(delegate()
{
_acad.AddLine(); // начинает выполняться Utility.GetPoint()
});
acadThread.Start();

// отображение диалогового окна
DialogResult res = fm.ShowDialog();
if (res == DialogResult.Cancel)
acadThread.Abort();
Возникает проблема:
Ссылка на AutoCAD остаётся действительной, в то время как попытка обращения к ActiveDocument (или к коллекции Documents) приводит к исключению "Вызов был отклонён" (RPC_E_CALL_REJECTCALL). Т.е. нельзя даже добавить в коллекцию новый документ.
При этом, однако, можно обращаться к приложению в целом (хотя бы, к примеру, вызвать Quit()).


Почему возникает такая ситуация, и как следует поступить в данном случае, чтобы её избежать?
Или может быть использовать для решения задачи другой подход?

Задача, уточняю, следующая:
Необходимо программно (из своего приложения и по желанию пользователя) прервать (отменить) выполнение последовательности интерактивных операций, подобной Utility.GetPoint().

Может быть есть возможность параллельно выполнению Utility.GetPoint() послать из другого потока в AutoCAD сигнал, аналогичный нажатию клавиши Escape во время интерактивного ввода координат точки)?

Спасибо!
Просмотров: 4072
 
Непрочитано 16.08.2011, 14:13
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Объектная модель автокада не поддерживает многопоточность, так что если и заработает то что называется "на честном слове". Хотя Вы вроде и обращаетесь с одного потока, но убивая его там явно что-то "соскакивает" попробуйте в потоке проверять не закрылось ли окно и штатно останавливайте (отменяйте?) действие.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.08.2011, 11:10
#3
IvanShkuropadsky


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


ясно, спасибо!
IvanShkuropadsky вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > AutoCAD Automation: как правильно программно прервать Utility.GetPoint (выполняется в другом потоке)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59