C++ &引用;“没有回应”;在从COM对象执行函数的过程中

C++ &引用;“没有回应”;在从COM对象执行函数的过程中,c++,vb.net,openmp,solidworks,comobject,C++,Vb.net,Openmp,Solidworks,Comobject,我已经好几天没找到解决办法了 我在VB.NET中为SolidWorks开发了一个宏。它使用了我在C++开发的DLL中的COM对象。此COM对象的功能运行时间较长(有时超过30秒),并且还使用OpenMP并行化循环 我的问题是,当我运行其中一个函数时,大约10秒后,程序停止响应,它冻结了我的UI!DLL函数正在运行,我们无法使用DoEvents()向UI发送更新 我试图将函数放在后台工作程序中,但对于COM对象,它不起作用。我尝试的另一件事是让一个后台工作程序以固定的时间间隔访问我的进程,以查看它

我已经好几天没找到解决办法了

我在VB.NET中为SolidWorks开发了一个宏。它使用了我在C++开发的DLL中的COM对象。此COM对象的功能运行时间较长(有时超过30秒),并且还使用OpenMP并行化循环

我的问题是,当我运行其中一个函数时,大约10秒后,程序停止响应,它冻结了我的UI!DLL函数正在运行,我们无法使用
DoEvents()
向UI发送更新

我试图将函数放在后台工作程序中,但对于COM对象,它不起作用。我尝试的另一件事是让一个后台工作程序以固定的时间间隔访问我的进程,以查看它是否响应。但当它停止响应时,我不能强迫它回答。我找到的唯一解决方案是更改注册表项的值
HungAppTimeout
,但这适用于我机器上的所有内容,而我希望它仅适用于我的代码

你会有一个避免“没有答案”的解决方案吗

代码示例:

Public Sub StartfunctionCOM()

   Dim Myclass as COMClass = new COMClass
   Myclass.functiontakemanytime() 'time >10sec

End Sub

我找到了一个解决方案:在C++代码中,我调用函数<代码> Deable PrimeWordOsgsGuest。它不会阻止应用程序“不响应”,但会删除自动Windows响应(即标准的“应用程序不再响应,等待或终止?”消息框)。

我认为您可能需要一个STA线程才能正确执行COM。实现这一点的一种方法是将基于任务的并行特性与定制任务调度器一起使用,该调度器将调度到STA线程上。在某处有一个“并行扩展附加”包,它提供了一个STA任务调度器。您可以使用
Task.Factory.StartNew
对工作进行排队,然后
等待
任务,以保持UI响应。如果这对你有用的话,我可以写下来作为答案。@Craig可能有什么想法。当你说“将函数放在后台工作程序中不起作用”是什么意思?你会遇到什么异常?我并没有在宏中尝试多线程,只是在加载项中。我想差不多了。您是否尝试将调用代码放在单独的线程中?或者,您可以按照函数TakeManytime()创建线程的方式修改函数TakeManytime(),然后启动真正的函数TakeManytime()@Keith Stein。“将函数放在后台工作程序中不起作用”,这意味着当我启动此后台工作程序时,它不会发生任何事情,而是等待doevent。当调用doevent时,backgroundworker函数将执行,但在主线程上。。。