我正在构建一个用于初始化 AutoCAD 实例的 IronPython 模块,在 AutoCAD 完成初始化、进入其消息循环并处于稳定状态后,我需要将 1 返回给调用它的模块(不加载依赖项/任何东西)状态。我尝试使用 System.Diagnostics.Process.WaitForInputIdle() ,但没有成功。
这是我到目前为止所拥有的:
import System.Diagnostics as sysdiag
def start_autocad(self):
print("\"C:\\Program Files\\Autodesk\\Autodesk AutoCAD Civil 3D 2014\\acad.exe\" /b \"C:\\Temp\\C3DAutoScript.scr\"")
for process in sysdiag.Process.GetProcessesByName("acad"):
process.Kill()
try:
acad_process = sysdiag.Process.Start("C:\\Program Files\\Autodesk\\Autodesk AutoCAD Civil 3D 2014\\acad.exe", " /b \"C:\\Temp\\C3DAutoScript.scr\"")
acad_process.WaitForInputIdle()
return 1
except:
return 0
不幸的是,这个函数在进程开始打开时立即返回,而不是在进程完成后返回。有谁知道在经典的 cPython、IronPython 或 C# 中处理这个问题的方法(不使用过度的 sleep 函数来等待它)?
最佳答案
进程几乎可以在启动后立即开始处理消息。在此之前不要求显示主窗口。这样做可以避免在加载缓慢的情况下显示为挂起。
您可以在 WaitForInputIdle
返回后尝试与进程交互 - 即使在“加载”时它也可能最终响应。如果不起作用,请等待主窗口出现(使用 FindWindow
)。如果应用程序是COM服务器,则尝试建立COM连接。
附注终止进程不是最好的主意,可能会导致数据或配置损坏。尝试正确关闭应用程序,将关闭事件发送到其主窗口。
关于c# - 确定进程何时完成初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25881791/