【问题标题】:Run a process as a synchronous operation from a Win32 application从 Win32 应用程序将进程作为同步操作运行
【发布时间】:2011-03-22 00:44:21
【问题描述】:

我有一个现有的实用程序,我们称之为 util.exe。它是一个命令行工具,它从命令行获取输入,并在磁盘上创建一个文件,比如说一个图像文件

我想通过运行 util.exe 在另一个应用程序中使用它。但是它需要同步,以便在处理继续时知道文件存在。

例如(伪)

bool CreateImageFile(params)
{
  //ret is util.exe program exit code
  int ret = runprocess("util.exe",params);
  return ret==0;
}

是否有一个 Win32 API 调用将运行该进程并等待它结束?我查看了 CreateProcess,但它在尝试启动时立即返回,我查看了 ShellExecute,但即使它同步的,这似乎也有点难看。

【问题讨论】:

  • 您已经通过提及 ShellExecute 回答了您自己的问题...
  • 有点难看,不是吗?另外,我不确定我的程序返回码是否回来了,当我尝试它时,我得到了一个随机值 42 :)
  • 还有一个叫做“同步_spawn”的东西,它通过将_P_WAIT标志作为第一个参数传递给_spawn函数之一来完成:docs.microsoft.com/en-us/cpp/c-runtime-library/reference/…

标签: visual-c++ winapi spawning


【解决方案1】:

进程句柄是一个等待对象,AFAIK。这正是您所需要的。

但是,我建议不要这样做。 Windows 上的启动过程可能会很慢,并且会阻塞您的 UI。考虑一个具有 50 毫秒等待超时的 PeekMessage 循环,以便从 Windows 应用程序执行此操作。

【讨论】:

  • support.microsoft.com/kb/125212 这让我很困惑。我在网上看到一些使用 WaitForSingleObject 的地方,但该页面说这不再有效;还是在谈论在 32 位中生成 16 位 exe?
  • 消息循环有什么帮助 - 我仍然必须以某种方式生成进程?另外,如果重点是我的应用程序在生成文件时暂停,那么阻塞应该可以吗?
  • 在 Windows 上创建进程可能很慢,但可能无法与进程终止所用的时间相提并论。因此,此处关键的不是 CreateProcess(),而是 WaitForSingleObject()。无论如何,您是在编写 GUI 应用程序还是控制台应用程序? (当然可以阻止一个简单的顺序控制台应用程序)
【解决方案2】:

没有单一的 api,但这实际上是 Win32 应用程序更有趣的一般问题。您可以在进程句柄上使用 CreateProcess 或 ShellExecuteEx 和 WaitForSingleObject。 GetExitCodeProcess 此时将为您提供程序的退出代码。简单示例代码见here

但是,这会完全阻塞您的主线程,并且在某些 Win32 消息传递方案下会给您带来严重的死锁问题。假设生成的 exe 执行广播发送消息。在所有窗口都处理完消息之前,它无法继续 - 但您无法继续,因为您被阻止等待它。僵局。由于您使用的是纯命令行程序,因此此问题可能不适用于您。您是否关心命令行程序是否会挂起一段时间?

普通应用程序的最佳通用解决方案可能是将进程启动和等待拆分到一个线程上,并在线程运行完成时将消息发布回您的主窗口。当您收到消息时,您知道可以安全地继续,并且不存在死锁问题。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2021-08-14
    • 2021-11-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多