在 AutoCAD .Net 插件中执行多线程作业

Doing multi-threading jobs inside AutoCAD .Net plugin

我知道 Autocad API 不应该在多线程中 called/used。但是如何做一个不涉及任何特定 Autocad 的多线程工作(在 Autocad .Net 插件中)calls/type?

情况是这样的: 1.some CAD 折线是通过 API 获取的,它们感兴趣的属性包装在客户类型中,然后 2.In 另一层针对这些客户类型进行了一些多线程计算。 3.The 应用程序客户类型通过 Autocad API 将其结果写回 CAD 折线。

只有第二步在多线程中完成。

应用程序使用 StartTransaction() 方法获取事务对象。到目前为止,我已经很多年没有经历过任何崩溃了。但是现在我正在尝试使用 StratOpenCloseTransasction() 它崩溃了很多次。特别是当 Editor.Rengen() 被调用时它会崩溃,因为我认为它会遍历数据库中的每个对象,也许有些对象已损坏。我确实缩小了问题范围,原因之一显然是这种多线程。

在没有使用 API 的情况下,CAD 在调用多线程时是否会崩溃?以这种方式使用多线程是否安全? StartTransaction() 在处理对象方面是否比 StartOpenCloseTransaction 更好?因为我没有经历过崩溃。

非常感谢

多线程最大的挑战是与主线程(AutoCAD 线程)同步回。当然,假设您不将任何 AutoCAD type/data/object 传递给另一个线程(仅纯 .NET/C++ 数据)。

意识到风险后,您可以使用此 PDF 中描述的方法进行同步:http://aucache.autodesk.com/au2011/sessions/2526/class_handouts/v1_CP2526_Taget.pdf

检查AutoCAD是否可以接收外部调用的主要代码如下:

bool isQuiescent(AcApDocument* pDoc = curDoc())
{
return ( (pDoc != NULL)
 && pDoc->isQuiescent()
 && ((pDoc->lockMode() == AcAp::kNotLocked) ||
 (pDoc->lockMode() == AcAp::kNone))
 && (acedCommandActive() == 0) // no script or lisp is active
 && (acDocManager != NULL)
 && (acDocManager->inputPending(pDoc) == 0)
 && (::GetInputState() == 0)
 );
}

为什么要使用 StartOpenCloseTransaction?有一点性能提升,但标准事务更安全。 OpenCloseTransaction 的问题在于没有人确切知道它是如何工作的。唯一的文档是:

behaves similar to a Transaction object, that wraps the Open and Close methods of an object making it easier to close all opened objects instead of having to explicitly close each opened object. Recommended for use in support or utility functions that might be called an unknown number of times, and used when working with most event handlers.

哪个不是很清楚...

我只在事件处理程序中使用它,当我需要开始事务时,对象在不断变化。