Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Chromium Embedded und Firemonkey (https://www.delphipraxis.net/207634-chromium-embedded-und-firemonkey.html)

Peter666 16. Apr 2021 13:40

Chromium Embedded und Firemonkey
 
Hi,

ich wollte mit LibCEF einen einfachen Offscreen Renderer bauen der mir in eine Bitmap die Webseite rendert. Das geht im Prinzip auch wie es soll, aber ich kriege die Anwendung nicht beendet. Ich konnte das ganze auf folgenden Code herunter trimmen:

Delphi-Quellcode:
unit UMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;

type
  TForm3 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation uses uCEFFMXWorkScheduler, UCefApplication;

{$R *.fmx}


procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS: int64);
begin
  if (GlobalFMXWorkScheduler <> nil) then
    GlobalFMXWorkScheduler.ScheduleMessagePumpWork(aDelayMS);
end;

procedure CreateGlobalCEFApp;
begin
  if assigned(GlobalCEFApp) then
    exit;

  GlobalFMXWorkScheduler := TFMXWorkScheduler.Create(nil);

  GlobalCEFApp := TCefApplication.Create;
  GlobalCEFApp.OnScheduleMessagePumpWork :=
    GlobalCEFApp_OnScheduleMessagePumpWork;
  GlobalCEFApp.EnableHighDPISupport := true;
  GlobalCEFApp.ExternalMessagePump := true;
  GlobalCEFApp.MultiThreadedMessageLoop := False;
  GlobalCEFApp.cache := 'cache';
  GlobalCEFApp.StartMainProcess;
end;


initialization

 CreateGlobalCEFApp;

finalization
 if assigned(GlobalFMXWorkScheduler) then
   GlobalFMXWorkScheduler.StopScheduler;

 DestroyGlobalCEFApp;

 DestroyGlobalFMXWorkScheduler;
end.
Eigentlich mache ich hier nichts anderes als die GlobalCefApp Klasse, den Scheduler zu erstellen und am Ende das ganze wieder zu beenden. Das macht er aber nicht. Irgendwie bleibt das MainForm als Kopie bestehen und cef_shutdown hängt fest.

Die Beispiele von LibCEF sind alles andere als übersichtlich und ich sehe dort nicht was die bei der Initialisierung anders machen.

CHackbart 16. Apr 2021 15:33

AW: Chromium Embedded und Firemonkey
 
Das kann ich erklären. Chromium startet die Instanz mehrfach sobald StartMainProcess aufgerufen wird. Damit das nicht passiert, musst du entweder

Delphi-Quellcode:
if GlobalCefApp.StartMainProcess then
begin
 application.initialize;
...
 application.run
end;
machen, oder das anderweitig blockieren. Eine elegante Lösung für das Problem ist mir aber auch nicht eingefallen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf