【发布时间】:2019-05-20 17:24:40
【问题描述】:
我使用的代码如下:
begin
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := True;
saSecurity.lpSecurityDescriptor := nil;
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
ccOk:=CreateProcess(nil, PChar(ExecutableFirst+' '+CommandsFirst),@saSecurity,@saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess);
if ccOk then
begin
CreateProcess(nil, PChar(ExecutableSecond + ' ' + CommandsSecond), @saSecurity,@saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess);
try
repeat Running:=MsgWaitForMultipleObjects(2,piProcess.hProcess,True,100,QS_ALLINPUT);
Application.ProcessMessages;
until Running <> WAIT_TIMEOUT
finally
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
if (Running=WAIT_OBJECT_0) then BidsConversion; //run this when both process has finished
end;
end else
begin
raise.Exception(GetLastError.toString);
Exit
end;
end;
代码工作,但有时它会触发BidsConversion,但第一个进程仍未完成,因此引发了异常。
为什么应用程序不等待两个进程完成然后触发程序?
【问题讨论】:
-
返回到 WaitForSingleObject。等待一个过程。然后是另一个。实际上,首先尝试一次只等待一个进程而不阻塞 UI。在你会走路之前不要尝试跑步。
-
请不要通过删除旧问题并用新代码替换来提出新问题。
-
您当前无法执行单个进程,并在不阻塞父 UI 的情况下等待它。在你成功完成一个进程之前尝试为两个进程编写代码是不会有成效的。再次。在你可以走路之前不要尝试跑步。将整个问题视为一系列学习的垫脚石。这就是人们学习的方式。
-
不断告诉你同样的事情而你不断犯同样的错误是令人沮丧的。例如,管道。这是我第四次告诉你,将单个管道的两端连接到单个进程的标准输入和标准输出是错误的。想想看。一个进程在读取它的输入时真的想遇到它自己的输出吗?这对你不起作用的原因是你还没有掌握基础知识。您需要停止尝试解决您的最终目标,并首先学习最终需要的技能。这需要时间。
标签: delphi cmd createprocess delphi-10.3-rio