我使用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 继续运行..
最佳答案
PROCESS_INFO
由 CreateProcess
填充的结构包含新进程的PID。
请注意,这不是 ffmpeg 进程的 PID。它将是 cmd 进程的 PID。使用 cmd
似乎没什么意义这里。你也可以直接调用ffmpeg。然后,您已经拥有了终止进程所需的 PID。
我不确定您要如何终止该进程。如果您要调用TerminateProcess
,那么你需要一个进程句柄而不是 PID。
请注意 CreateProcess
返回 BOOL
而不是 handle 。我以前见过这个变量命名错误,我希望在某个地方有一些示例代码犯了错误,然后使用它的每个人都会重复它。叹。
关于delphi - 获取 Delphi 中 CreateProcess 创建的程序的 PiD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992658/