From 28bf09272d6e7dfb0cc2cd90bb3cc67dc8e84b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20D=C3=ADaz=20Fau?= Date: Sat, 10 Feb 2018 18:53:22 +0100 Subject: [PATCH] Added two optional properties to GlobalCEFApp to wait for the child processes before shutting down. Added GlobalCEFApp.WaitForChildProcesses and GlobalCEFApp.WaitTime. --- packages/CEF4Delphi_FMX.res | Bin 676 -> 724 bytes source/uCEFApplication.pas | 134 +++++++++++++++++++++++++++++++----- 2 files changed, 116 insertions(+), 18 deletions(-) diff --git a/packages/CEF4Delphi_FMX.res b/packages/CEF4Delphi_FMX.res index 2b6bf397780fb584fc767b5ef780f54b506d6cb3..0b1d7bfebb7dc1e50dd62d97ee57ed52405f8ff3 100644 GIT binary patch delta 82 zcmZ3&dWCg@0%OQTMR_3M7|pn8;#_6MzKI9jWz87485kKn8S)rP7*ZLEfOH~54uc<% g%w 0) then begin @@ -520,18 +533,6 @@ begin inherited Destroy; end; -procedure TCefApplication.RemoveAppReferences; -begin - try - if (FResourceBundleHandler <> nil) then FResourceBundleHandler.RemoveReferences; - if (FBrowserProcessHandler <> nil) then FBrowserProcessHandler.RemoveReferences; - if (FRenderProcessHandler <> nil) then FRenderProcessHandler.RemoveReferences; - except - on e : exception do - if CustomExceptionHandler('TCefApplication.RemoveAppReferences', e) then raise; - end; -end; - procedure TCefApplication.AfterConstruction; begin inherited AfterConstruction; @@ -540,6 +541,57 @@ begin FCustomCommandLineValues := TStringList.Create; end; +procedure TCefApplication.BeforeDestruction; +begin + DestroyResourceBundleHandler; + DestroyBrowserProcessHandler; + DestroyRenderProcessHandler; + + inherited BeforeDestruction; +end; + +procedure TCefApplication.DestroyResourceBundleHandler; +begin + try + if (FResourceBundleHandler <> nil) then + begin + FResourceBundleHandler.RemoveReferences; + FResourceBundleHandler := nil; + end; + except + on e : exception do + if CustomExceptionHandler('TCefApplication.DestroyResourceBundleHandler', e) then raise; + end; +end; + +procedure TCefApplication.DestroyBrowserProcessHandler; +begin + try + if (FBrowserProcessHandler <> nil) then + begin + FBrowserProcessHandler.RemoveReferences; + FBrowserProcessHandler := nil; + end; + except + on e : exception do + if CustomExceptionHandler('TCefApplication.DestroyBrowserProcessHandler', e) then raise; + end; +end; + +procedure TCefApplication.DestroyRenderProcessHandler; +begin + try + if (FRenderProcessHandler <> nil) then + begin + FRenderProcessHandler.RemoveReferences; + FRenderProcessHandler := nil; + end; + except + on e : exception do + if CustomExceptionHandler('TCefApplication.DestroyRenderProcessHandler', e) then raise; + end; +end; + procedure TCefApplication.AddCustomCommandLine(const aCommandLine, aValue : string); begin if (FCustomCommandLines <> nil) then FCustomCommandLines.Add(aCommandLine); @@ -1015,6 +1067,52 @@ begin FRenderProcessHandler := TCefCustomRenderProcessHandler.Create(self); end; +procedure TCefApplication.EnumerateAndWaitForChildProcesses; +{$IFDEF MSWINDOWS} +var + TempHandle : THandle; + TempProcess : TProcessEntry32; + TempArray : array [0 .. pred(MAXIMUM_WAIT_OBJECTS)] of THandle; + TempPID : DWORD; + i : integer; + TempMain, TempSubProc, TempName : string; +{$ENDIF} +begin +{$IFDEF MSWINDOWS} + for i := 0 to pred(MAXIMUM_WAIT_OBJECTS) do TempArray[i] := 0; + + TempHandle := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); + TempProcess.dwSize := Sizeof(TProcessEntry32); + TempPID := GetCurrentProcessID; + TempMain := ExtractFileName(paramstr(0)); + TempSubProc := ExtractFileName(FBrowserSubprocessPath); + + Process32First(TempHandle, TempProcess); + + i := 0; + repeat + if (TempProcess.th32ProcessID <> TempPID) and + (TempProcess.th32ParentProcessID = TempPID) then + begin + TempName := TempProcess.szExeFile; + TempName := ExtractFileName(TempName); + + if (CompareText(TempName, TempMain) = 0) or + ((length(TempSubProc) > 0) and (CompareText(TempName, TempSubProc) = 0)) then + begin + TempArray[i] := TempProcess.th32ProcessID; + inc(i); + end; + end; + until not(Process32Next(TempHandle, TempProcess)) or (i = MAXIMUM_WAIT_OBJECTS); + + CloseHandle(TempHandle); + + if (i > 0) then + WaitForMultipleObjects(i, @TempArray, True, FWaitTime); +{$ENDIF} +end; + procedure TCefApplication.Internal_OnContextInitialized; begin InitializeCookies;