如何为 Revit 编写多线程插件?
How to write a Multi threaded plugin for Revit?
对于 Revit
插件,我编写了以下代码:
public Result Execute(ExternalCommandData commandData,
ref string message, ElementSet elements)
{
try
{
Global.GetInstance(commandData);
message = "Studio Launcher";
var mw = new MainWindow();
mw.ShowDialg();
}
catch (Exception)
{
TaskDialog.Show("Failure", "Please Open or Create a document");
return Result.Failed;
}
return Result.Succeeded;
}
在这个插件中 MainWindow
是一个 ui 用户与之交互并且一些交易发生在那里。
它很有魅力,但表单不是无模式的,因为该插件与 Revit
本身位于同一线程中。为了提供无模式的 window,我将 mw.ShowDialg();
更改为 mw.Show();
。虽然插件成功启动并且 MainWindow 变为无模式并且用户能够同时与插件和 Revit 交互,但当我在 MainWindow 中打开事务时,revit 崩溃,因为 Execute() 方法在打开该事务之前终止。
如果有任何方法可以为 revit 开发多线程插件,请帮助我。
有关该主题的一长串讨论,请参阅 Building Coder blog。如果您只是希望能够有一个无模式对话框,那么可以使用 ExternalEvents 或 Idling Events。但是,如果您希望同时 运行 多个线程,那么您就不走运了,因为 Revit API 不允许这样做。
马特完全正确。 Revit API 根本不支持多线程。 Revit API 的使用需要有效的 API 上下文,并且仅在 Revit 事件处理程序中提供,例如Application.OnStartup、外部事件执行、DMO 执行等
解决方法是使用外部事件。 ModelessDialog/ModelessForm_ExternalEvent 示例提供了一个示例,The Building Coder 主题组提供了关于此的一长串详细讨论,关于无模式访问和从外部驱动 Revit 的空闲和外部事件:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28
对于 Revit
插件,我编写了以下代码:
public Result Execute(ExternalCommandData commandData,
ref string message, ElementSet elements)
{
try
{
Global.GetInstance(commandData);
message = "Studio Launcher";
var mw = new MainWindow();
mw.ShowDialg();
}
catch (Exception)
{
TaskDialog.Show("Failure", "Please Open or Create a document");
return Result.Failed;
}
return Result.Succeeded;
}
在这个插件中 MainWindow
是一个 ui 用户与之交互并且一些交易发生在那里。
它很有魅力,但表单不是无模式的,因为该插件与 Revit
本身位于同一线程中。为了提供无模式的 window,我将 mw.ShowDialg();
更改为 mw.Show();
。虽然插件成功启动并且 MainWindow 变为无模式并且用户能够同时与插件和 Revit 交互,但当我在 MainWindow 中打开事务时,revit 崩溃,因为 Execute() 方法在打开该事务之前终止。
如果有任何方法可以为 revit 开发多线程插件,请帮助我。
有关该主题的一长串讨论,请参阅 Building Coder blog。如果您只是希望能够有一个无模式对话框,那么可以使用 ExternalEvents 或 Idling Events。但是,如果您希望同时 运行 多个线程,那么您就不走运了,因为 Revit API 不允许这样做。
马特完全正确。 Revit API 根本不支持多线程。 Revit API 的使用需要有效的 API 上下文,并且仅在 Revit 事件处理程序中提供,例如Application.OnStartup、外部事件执行、DMO 执行等
解决方法是使用外部事件。 ModelessDialog/ModelessForm_ExternalEvent 示例提供了一个示例,The Building Coder 主题组提供了关于此的一长串详细讨论,关于无模式访问和从外部驱动 Revit 的空闲和外部事件:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.28