我使用delphi XE3我调用cmd并在一个线程中打开ffmpeg并将命令传递给它
我想同时运行5个或更多线程
procedure RunFF.Execute;
var
SecAtrrs: TSecurityAttributes;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
pCommandLine: array[0..255] of AnsiChar;
BytesRead: Cardinal;
WorkDir,result: string;
Handle: Boolean;
begin
Result := '';
workdir :='C:\Users\M\Desktop\ffmpeg\bin';
with SecAtrrs do begin
nLength := SizeOf(SecAtrrs);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SecAtrrs, 0);
try
with StartupInfo do
begin
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
cb := SizeOf(StartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
// WorkDir := Work;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' + cmd2),
nil, nil, True, 0, nil,
PChar(WorkDir), StartupInfo, ProcessInfo);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, pCommandLine, 255, BytesRead, nil);
if BytesRead > 0 then
begin
pCommandLine[BytesRead] := #0;
Result := Result + pCommandLine;
form3.Memo1.Text := result;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
finally
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;
我如何获得ffmpeg或cmd的PiD以便我可以杀死它!因为当我关闭我的应用程序cmd和ffmpeg继续运行..
答案 0 :(得分:2)
CreateProcess
填充的PROCESS_INFO
结构包含新进程的PID。
请注意,这不是ffmpeg进程的PID。它将是cmd进程的PID。在这里使用cmd
似乎没什么意义。你也可以直接打电话给ffmpeg。然后你已经拥有了所需的PID来杀死这个过程。
我不确定你是怎么想杀死这个过程的。如果要打电话给TerminateProcess
,那么您需要一个处理句柄而不是PID。
请注意,CreateProcess
会返回BOOL
而不是句柄。我之前看到的这个变量命名错误,我希望某处有一些示例代码会导致错误,然后每个使用它的人都会重复它。叹息。