c# - 确定进程何时完成初始化

标签 c# python ironpython

我正在构建一个用于初始化 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/

相关文章:

c# - 如何在特定位置呈现用户控件子项?

python - 计算 for 循环期间的运行总计 - Python

c# - 对于运算符重载,C# 编译器如何决定哪个实现适用于混合类型的操作数?

要列出的字符串内的 Python 列表

python - 使用 try 语句如何避免竞争条件?

wpf - IronPython 或 IronRuby 是否非常适合 WPF/Silverlight 中的 MVVM 模式?

javascript - 有没有办法通过单击按钮从 Spotfire 发送电子邮件?

ide - 我应该使用什么 IronPython IDE?

c# 将 Array.ForEach 操作谓词与值类型或字符串的数组一起使用

c# - 通用 Find 方法,用于按 Guid 类型搜索实现 IDbSet 接口(interface)的类