在我的主要过程中,我使用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);
但我无法以交互方式更新“结果”。我的应用程序在转换期间保留,并且只有在ffmpeg的进程完成后才会更新“结果”字符串。
如何让我的主进程和ffmpeg同时运行,并以交互方式读取/写入ffmpeg进程的输出/输入?
谢谢你的时间!
逻辑资源
答案 0 :(得分:1)
如果ffmpeg只使用stdout而没有显式刷新输出,那么它可能不会被发送到调用进程,直到它结束
使用此类C运行时函数的子进程如printf()和 重定向时,fprintf()可能表现不佳。 C运行时函数 维护单独的IO缓冲区。重定向时,这些缓冲区可能不会 每次IO调用后立即刷新。结果,输出到了 printf()调用的重定向管道或getch()的输入 呼叫不会立即刷新和延迟,有时是无限延迟 发生。如果子进程刷新IO,则可以避免此问题 每次调用C运行时IO函数后的缓冲区。只有孩子 进程可以刷新其C运行时IO缓冲区。进程可以刷新其C 通过调用fflush()函数运行时IO缓冲区。
答案 1 :(得分:1)
为了跟踪子进程运行时(以及完成后)的进度,您需要检查该子进程的状态。 启动该过程后,请使用以下代码定期检查状态。 pi是PROCESS_INFORMATION:
PROCESS_INFORMATION pi;
和代码:
DWORD exitCode = 0;
success = [GetExitCodeProcess][2](pi.hProcess, &exitCode);
如果进程仍在运行,exitCode 将保留值STILL_ACTIVE。
如果函数成功,则成功的返回值将为非零。