【问题标题】:WaitForSingleObject signals too soon ImageMagick convertWaitForSingleObject 信号过早 ImageMagick 转换
【发布时间】:2012-11-27 01:45:42
【问题描述】:

我正在使用 ImageMagick 将 PDF 转换为 JPG。这个转换需要几百毫秒才能运行,所以我有一个WaitForSingleItem 等待进程句柄。

不幸的是,该过程几乎立即完成,并且转换没有完成(我假设它由于句柄被关闭而中断)。我想要同步行为。

我有一个连接到进程的输出管道,但我根本没有得到任何输出, 错误或其他情况,因为该过程认为“好的,完成,关闭所有内容并继续前进。”

通过不那么密集的操作,一切都按预期工作 - 错误、输出等 - 我认为问题几乎肯定在等待。

有人可以就如何解决这个问题提出建议吗?这是一些适用的代码,可能不是很有帮助,但它是唯一重要的部分,因为其他一切都很好。

运行代码后,我收到消息WAIT_OBJECT_0

if (!CreateProcess(
    NULL, 
    (LPSTR) "convert test.pdf test.jpg",
    NULL,
    NULL,
    TRUE,
    CREATE_NO_WINDOW,
    NULL,
    NULL,
    &si,
    &pi
    )) { console_->AddItem("ERROR: Failed to create process."); }

DWORD wait = WaitForSingleObject(pi.hProcess, INFINITE);
if (wait == WAIT_ABANDONED)     { MessageBox(NULL, "WAIT_ABANDONED", "Alert", MB_OK); }
else if (wait == WAIT_OBJECT_0) { MessageBox(NULL, "WAIT_OBJECT_0", "Alert", MB_OK); }
else if (wait == WAIT_TIMEOUT)  { MessageBox(NULL, "WAIT_TIMEOUT", "Alert", MB_OK); }
else if (wait == WAIT_FAILED)   { MessageBox(NULL, "WAIT_FAILED", "Alert", MB_OK); }
else                            { MessageBox(NULL, "END OF THE WORLD", "Alert", MB_OK); }

【问题讨论】:

  • 您确定需要更长时间“更密集”的命令确实有效并且不会出错?
  • 是的,我也在cmd 中单独测试过,而且多年来我一直在使用不同语言的该命令。此外,我尝试了其他带有故意错误的“不太密集”的命令,并且它们顺利通过管道。
  • GetExitCodeProcess 返回什么?
  • GetExitCodeProcess 返回4,所以问题一定出在命令上。我已经删除了CREATE_NO_WINDOW 标志,那里有一些有趣的事情 - 感谢您提供的提示。过几回。
  • 您在命令中使用了相对路径,甚至是“转换”可执行文件本身。您应该对所有内容使用绝对路径。至少这将消除一个可能的故障点。

标签: c++ winapi process cmd synchronous


【解决方案1】:

愚蠢的错误,与WINAPI无关。一切正常。

http://support.cs.nott.ac.uk/help/docs/image/ImageMagick/www/FAQ.html#C19

ImageMagick 有一个 convert 命令,但 Windows 也有,所以它使用了错误的该死的命令。

当我直接通过cmd 执行此操作时,它按预期工作,但由于某种原因通过CreateProcess,使用了错误的convert.exe。不知道为什么会这样,但很容易解决。

ImageMagick 的一个有趣的小插曲:The Windows convert.exe program is used to convert a system boot disk from MS-DOS "FAT" format to NTFS format. As such it can only be used one time in the life of a system.

感谢@jeremy 提供的有用提示。

【讨论】:

  • 更有理由永远不要依赖相对路径,而是总是使用绝对路径。
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多