2012-11-27 27 views
2

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

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

我有一个输出管道连接到进程,我根本没有得到任何输出, 错误或其他,因为进程认为“确定,完成,关闭所有东西,继续前进”。

由于操作不太密集,一切都按预期工作 - 错误,输出等 - 我认为问题几乎肯定在等待中。

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

我运行代码后,收到消息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); } 
+0

您是否肯定需要花费更长时间“更密集”的命令才能正常工作并且不会出错? – jeremy

+0

是的,我已经在'cmd'中单独测试过了,而且现在我已经在不同的语言中使用过这个命令了。另外,我尝试了其他带有故意错误的“不太密集的”命令,并且他们没有问题就下了管道。 – Ben

+0

GetExitCodeProcess返回什么? – jeremy

回答

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为有用的提示。

+0

很高兴能帮到你! – jeremy

+0

所有更多的理由永远不要依赖相对路径总是使用绝对路径。 –