c++ - WaitForSingleObject 信号过早 ImageMagick 转换

标签 c++ winapi process cmd synchronous

我正在使用 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); }

最佳答案

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

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

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

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

来自 ImageMagick 的一个有趣的小插曲:Windows convert.exe 程序用于将系统启动盘从 MS-DOS“FAT”格式转换为 NTFS 格式。因此,它在一个系统的生命周期中只能使用一次。

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

关于c++ - WaitForSingleObject 信号过早 ImageMagick 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576196/

相关文章:

c++ - 如何在C++中创建元组 vector ?

c++ - 带有模板类成员实现的 undefined reference

c++ - 使用 C/C++ 在 OSX 中获取进程创建日期时间

java - 基于优先级的线程?

C# 以编程方式取消 Windows 关机

python - 错误 : stray '\' in program in macro definition

c++ - boost/random/uniform_int.hpp 和 boost/random/uniform_int_distribution.hpp 可以互换使用吗?

c - 写文件和写控制台

c++ - 检查套接字是否已在 C++ 中关闭

windows - 如何将OsString传递给Win32 API调用