14

私はCバックグラウンドからではないということから始めましょう。私はPHP開発者です。したがって、これまでにコーディングしたことはすべて、他の例から少しずつ取り出して、要件を満たすように微調整することです。ですから、私があまりにも基本的または明白な質問をする場合は、私に耐えてください。

FFmpeg使い始めCreateProcess()ました

int startFFmpeg()
{
    snprintf(cmd, sizeof(cmd), "D:\\ffpmeg\bin\ffmpeg.exe -i D:\\video.mpg -r 10 D:\\frames");

    PROCESS_INFORMATION pi;
    STARTUPINFO si={sizeof(si)};
    si.cb = sizeof(STARTUPINFO);
    int ff = CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
    return ff;
}

私がする必要があるのはPID、そのプロセスを取得し、しばらくしてからまだ実行されているかどうかを後で確認することです。これは基本的に私が探しているものです:

int main()
{
    int ff = startFFmpeg();
    if(ff)
    {
       // great! FFmpeg is generating frames
       // then some time later
       if(<check if ffmpeg is still running, probably by checking the PID in task manager>) // <-- Need this condition
       {
            // if running, continue
       }
       else
       {
           startFFmpeg();
       }
    } 
  return 0;   
}

調べてみたところ、PIDが返されることがわかりましたPROCESS_INFORMATIONが、取得方法の例が見つかりませんでした。

一部のメタデータ

OS:Windows 7
言語:C
IDE:Dev C ++

4

2 に答える 2

17

あなたの場合、最後のパラメータとして渡したPROCESS_INFORMATION構造体からそれを引き出しますCreateProcess()pi.dwProcessId

ただし、それがまだ実行されているかどうかを確認するには、プロセスハンドルを待つことをお勧めします。

static HANDLE startFFmpeg()
{
    snprintf(cmd, sizeof(cmd), "D:\\ffpmeg\bin\ffmpeg.exe -i D:\\video.mpg -r 10 D:\\frames");

    PROCESS_INFORMATION pi = {0};
    STARTUPINFO si = {0};
    si.cb = sizeof(STARTUPINFO);
    if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
    {
        CloseHandle(pi.hThread);
        return pi.hProcess;
    }
    return NULL;
}

起動時main()に、次のようなことを行うことができます...

int main()
{
    HANDLE ff = startFFmpeg();
    if(ff != NULL)
    {
        // wait with periodic checks. this is setup for
        //  half-second checks. configure as you need
        while (WAIT_TIMEOUT == WaitForSingleObject(ff, 500))
        {
            // your wait code goes here.
        }

        // close the handle no matter what else.
        CloseHandle(ff);
    }
    return 0;
}
于 2013-02-22T07:16:06.857 に答える
4

win32api関数を使用することをお勧めしますGetProcessId()

#include <windows.h>

...

BOOL bSuccess = FALSE;
LPTSTR pszCmd = NULL;
PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0};
si.cb = sizeof(si);

pszCmd = ... /* assign something useful */

bSuccess = CreateProcess(NULL, pszCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

if (bSuccess)
{
  DWORD dwPid = GetProcessId(pi.hProcess);
  ...
}
else
  ... /* erorr handling */

詳細については、こちらを参照してください:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms683215%28v=vs.85%29.aspx

于 2013-02-22T07:15:48.470 に答える