Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Chromium CEF3 DLL "blockiert" (https://www.delphipraxis.net/189659-chromium-cef3-dll-blockiert.html)

bekrause 6. Jul 2016 15:06

Chromium CEF3 DLL "blockiert"
 
Hallo,

ich stehe vor einem (für mich) bisher nicht lösbaren Problem.

Ich habe ein Programm, welches den Quelltext des Browser auswertet (u.a. mit regulären Ausrücken). Um auch zukünftig eine gewisse Kompatibilität zu erhalten, möchte ich von CES1 auf CES3 wechseln. Grundsätzlich funktioniert das auch ganz gut. Lediglich der Quelltext der Webseite wird nicht richtig ausgelesen.

Bei CES1 konnte ich den Quelltext simpel mit "getsource" in einem String speichern. Bei CEF3 funktioniert das über eine Callbackfunktion.

Um das Programm fortzuführen (z.B. um zu entscheiden, ob eine Webseite weiter gescrollt werden muss oder nicht) muss der Quelltext untersucht werden. Jetzt ist es aber so, dass die Callbackfunktion nicht aufgerufen wird, wenn ich mit dem Hauptprogramm mit einer Repeat - Application.processmessage Schleife auf die Callbackfunktion warte. Wenn ich auf eine Auswertung des Quelltextes verzichte, und die Bearbeitung nach Quelltexterhebung unterbreche, wir die Callbackfunktion sofort aufgerufen.
Die Repeat schleife scheint also das Aufrufen der Callbackfuntkion zu verhindern.

Hier mein Code:

Delphi-Quellcode:
  procedure HTMLSourceCallback(const str: ustring);
  begin
    //str is the SourceHtml
    FBrowserSource := str;
    FBrowserGetSourceBusy := False;
  end;
Delphi-Quellcode:
function TBrowserCES3.GetSource: string;
begin
  FBrowserSource := '';
  FBrowserGetSourceBusy := true;
  FBrowser.Browser.MainFrame.GetSource(TCefFastStringVisitor.Create(HTMLSourceCallback));
  repeat
    application.ProcessMessages;
    sleep(10);
  until FBrowserGetSourceBusy = False;
  Result := FBrowserSource;
end;
Kann ich CEF3 irgendwie dazu bringen, auch innerhalb der Repeatschleife weiterzuarbeiten und die Callbackfunktion aufzurufen? Oder habe ich einen Denkfehler?

Schon mal Danke

Benno

jaenicke 6. Jul 2016 15:28

AW: Chromium CEF3 DLL "blockiert"
 
Ich vermute das liegt daran, dass das ganze in Threads läuft. Vielleicht blockierst du mit der Schleife eine Synchronisierung mit dem Hauptthread, so dass ein Thread darauf wartet das Ergebnis abzuliefern.

Das Polling ist aber ohnehin keine gute Idee. Du solltest deinen Quelltext besser so umbauen, dass er korrekt auf den Callback reagiert und die Verarbeitung dort macht.
Unter Android und iOS wird diese Arbeitsweise noch viel stärker forciert. Eben weil das die GUI in aller Regel deutlich responsiver macht.

bekrause 6. Jul 2016 16:40

AW: Chromium CEF3 DLL "blockiert"
 
Danke erstmal für Deine Info.
Ich habe jetzt folgendes herausgefunden. Das Verfahren von mir funktioniert bei einigen Webseiten. So wird der Quelltext von Facebook, vor der Benutzeranmeldung angezeigt, nach der Benutzeranmeldung bleibt das Programm in der Daueschleife Hängen.
Sehr ominös.

Gruß Benno


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.

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