在我的主进程中,我使用CreateProcess(...)创建了一个ffmpeg子进程。我需要跟踪转换进度的状态以更新进度条。为此,我从ffmpeg输出中读取文本并从中提取进度状态。
我做了一个这样的示例程序:
HANDLE rPipe, wPipe;
CreatePipe(&rPipe,&wPipe,&secattr,0);
STARTUPINFO sInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
PROCESS_INFORMATION pInfo;
ZeroMemory(&pInfo,sizeof(pInfo));
sInfo.cb=sizeof(sInfo);
sInfo.dwFlags=STARTF_USESTDHANDLES;
sInfo.hStdInput=NULL;
sInfo.hStdOutput=wPipe;
sInfo.hStdError=wPipe;
// pStr contain ffmpeg command
CreateProcess(0,(LPTSTR)pStr,0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
CloseHandle(wPipe);
BOOL ok;
do
{
memset(buf,0,bufsize);
ok=::ReadFile(rPipe,buf,100,&reDword,0);
result += buf;
}while(ok);但是我不能交互地更新“结果”。我的应用程序在转换过程中被挂起,"result“字符串只有在ffmpeg的进程完成后才会更新。
如何让我的主进程和ffmpeg同时运行,并交互地读/写ffmpeg进程的输出/输入?
耽误您时间,实在对不起!
LRs
发布于 2011-07-12 11:56:05
如果ffmpeg只使用stdout而没有显式刷新输出,则在结束之前可能不会将其发送到调用进程。
使用诸如printf()和
()之类的C运行时函数的fprintf子进程在重定向时可能表现不佳。C运行时函数维护单独的IO缓冲区。重定向时,这些缓冲区可能不会在每次IO调用后立即刷新。因此,printf()调用的重定向管道的输出或getch()调用的输入不会立即刷新,并且会出现延迟,有时甚至是无限延迟。如果子进程在每次调用C运行时IO函数后刷新IO缓冲区,则可以避免此问题。只有子进程可以刷新其C运行时IO缓冲区。进程可以通过调用fflush()函数来刷新其C运行时IO缓冲区。
http://support.microsoft.com/kb/190351
发布于 2019-08-16 02:06:42
为了在子进程运行时(以及完成后)跟踪子进程的进度,您需要检查该子进程的状态。进程启动后,使用以下代码定期检查状态。pi是PROCESS_INFORMATION
PROCESS_INFORMATION pi;和代码:
DWORD exitCode = 0;
success = [GetExitCodeProcess][2](pi.hProcess, &exitCode);如果进程仍在运行,则exitCode将保存值STILL_ACTIVE。
如果函数成功,则success的返回值为非零。
https://stackoverflow.com/questions/6659037
复制相似问题