Delphi 7 CEF (Chromium Embedded Framework) fagyás

Delphi 7 CEF (Chromium Embedded Framework) fagyás
2014-12-02T20:53:41+01:00
2014-12-06T23:13:28+01:00
2022-10-15T23:00:23+02:00
hanko2
Sziasztok!
A problémám a következő:
A programom Chromium alapú böngészővel tölt be weblapokat, de teljesen rendszertelenül megfagy a böngésző.
Van mikor az 5. weboldalnál, van mikor a 10.nél, úgy hogy a lista mindig ugyanaz,és a weblap tartalma is változatlan.
Van mikor teljesen végigfut. Ezért a memóriahasználat alapján ha 15 másodpercig ugyanannyi memóriát használ akkor kilövöm a programot,és újra indítom, de ez nem a legjobb megoldás.
 A kérdésem az lenne hogy más is találkozott már ezzel a jelenséggel,és ha igen akkor mi a megoldás?

A program így tölti be az oldalakat:

procedure TForm1.betolt2Click(Sender: TObject);
var MainFrame : ICefFrame;
begin
MainFrame := Chromium1.Browser.GetMainFrame;
MainFrame.LoadUrl(url);
end;

Majd a Loadend-ben figyelek,és ha betöltött akkor  2mp késleltetéssel megnézem az oldal forrását:

procedure TForm1.forrasClick(Sender: TObject);
var
CefStringVisitor:ICefStringVisitor;
MainFrame : ICefFrame;
begin
    CefStringVisitor := TCefFastStringVisitor.Create(StringVisitor);
  MainFrame := Chromium1.Browser.GetMainFrame;
  MainFrame.GetSource(CefStringVisitor);
end;

procedure StringVisitor(const str: ustring);
begin
  //str is the SourceHtml
 s:=str;

end;

Ha ez kész akkor kezdődik minden előröl egy új url-el.
Vagyis kezdődne ha nem fagyna ki....
Mutasd a teljes hozzászólást!
Az a megáll hibával szerintem annyit tesz hogy én arra használtam hogy XML-ket küldözgettem PHP-ból a delphis programomnak válaszként, és a response textet egy xmldocba tettem át feldolgozásra. Mivel neked egy html jön az adott oldalról, még jó hogy sipákol, ha be akarod tölteni egy XML-be. Neked csak a response.text kell azt kell elmentened forrásként. Azt gondoltam át is alakítod a kódot igényed szerint , nem csak copy-paste. Megcsináltam, most arra is meg webbrowser komponensre is.

unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,msxml, mshtml, XMLDoc, XMLintf, xmldom, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private req: IXMLHttpRequest; { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin req := {$IFDEF VER210} CoXMLHTTP {$ELSE} CoXMLHTTPRequest {$ENDIF}.Create; end; procedure TForm2.Button1Click(Sender: TObject); var params: string; st:Tstringlist; begin TRY params := ''; req.open('GET', 'https://www.marathonbet.com/en/', FALSE, EmptyParam, EmptyParam); req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); req.setRequestHeader('Content-length', inttostr(length(params))); req.setRequestHeader('Connection', 'close'); req.send(params); if req.status = 200 then begin st:=Tstringlist.Create; st.Text:=req.responseText; st.SaveToFile('C:\tmp\index.html'); st.Free; end else begin showmessage('A szerver karbantartás alatt.Kérem próbálja meg késöbb'); terminateprocess(getcurrentprocess, 0); end; except END; end; end.
 
webbrowser komponenssel.

procedure TForm1.LoadBtnClick(Sender: TObject); begin WebBrowser1.Navigate('https://www.marathonbet.com/en/'); end; function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String; var LStream: TStringStream; Stream : IStream; LPersistStreamInit : IPersistStreamInit; begin if not Assigned(WebBrowser.Document) then exit; LStream := TStringStream.Create(''); try LPersistStreamInit := WebBrowser.Document as IPersistStreamInit; Stream := TStreamAdapter.Create(LStream,soReference); LPersistStreamInit.Save(Stream,true); result := LStream.DataString; finally LStream.Free(); end; end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var st:Tstringlist; begin If (pDisp = IDispatch(WebBrowser1.OleObject) ) Then begin st:=Tstringlist.Create; st.Text:= GetWebBrowserHTML(WebBrowser1); st.SaveToFile('C:\tmp\index.html'); st.Free; end; end;
Mutasd a teljes hozzászólást!

  • A loadend többször is meghívódik, ha az oldalhoz tartoznak egyéb elemek (képek,szkriptek,css) ott nem várni kell másodpercekig, hanem azt vizsgálni hogy  a HttpStatusCode  = 200 és a Frame.IsMain = true teljesül e.Ha semmi extra nem kell neked az oldalból csak a forrás akkor megoldhatod sokkal egyszerűbben is a dolgot, Chromium sem kell. Használd az IXMLHttpRequest  -t a letöltéshez.

    unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,msxml, mshtml, XMLDoc, XMLintf, xmldom, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private req: IXMLHttpRequest; { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin req := {$IFDEF VER210} CoXMLHTTP {$ELSE} CoXMLHTTPRequest {$ENDIF}.Create; end; procedure TForm2.Button1Click(Sender: TObject); var XMLDoc: TXMLDocument; params: string; begin TRY params := ''; req.open('POST', 'http://localhost/szamlatetelinsertinit1.php', FALSE, EmptyParam, EmptyParam); req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); req.setRequestHeader('Content-length', inttostr(length(params))); req.setRequestHeader('Connection', 'close'); req.send(params); if req.status = 200 then begin XMLDoc := TXMLDocument.Create(nil); XMLDoc.LoadFromXML(req.responseText); XMLDoc.Active := true; XMLDoc.SaveToFile('filename.txt'); end else begin showmessage('A szerver karbantartás alatt.Kérem próbálja meg késöbb'); terminateprocess(getcurrentprocess, 0); end; except END; end; end.
    Mutasd a teljes hozzászólást!
  • Hello!

    Kipróbáltamaz IXMLHttpRequest-el nem működik,mindig megáll valami hibával.
    Egyébként ennek az oldalnak kellene a tartalma, ha ezt meg tudom csinálni akkor mindent meg tudok:

    Top sports betting odds with Marathonbet

    Valóban nem kell nekem az oldalt "látnom", csak a forrása kell, de bármilyen böngészővel próbálkoztam eddig csak a Chromium tudta betölteni és megjeleníteni nekem az oldal forrását.
    Ha tudsz valamit amivel ki tudnám nyerni a megadott oldal tartalmát azt nagyon megköszönném ;)
    Mutasd a teljes hozzászólást!
  • Az a megáll hibával szerintem annyit tesz hogy én arra használtam hogy XML-ket küldözgettem PHP-ból a delphis programomnak válaszként, és a response textet egy xmldocba tettem át feldolgozásra. Mivel neked egy html jön az adott oldalról, még jó hogy sipákol, ha be akarod tölteni egy XML-be. Neked csak a response.text kell azt kell elmentened forrásként. Azt gondoltam át is alakítod a kódot igényed szerint , nem csak copy-paste. Megcsináltam, most arra is meg webbrowser komponensre is.

    unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,msxml, mshtml, XMLDoc, XMLintf, xmldom, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private req: IXMLHttpRequest; { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); begin req := {$IFDEF VER210} CoXMLHTTP {$ELSE} CoXMLHTTPRequest {$ENDIF}.Create; end; procedure TForm2.Button1Click(Sender: TObject); var params: string; st:Tstringlist; begin TRY params := ''; req.open('GET', 'https://www.marathonbet.com/en/', FALSE, EmptyParam, EmptyParam); req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); req.setRequestHeader('Content-length', inttostr(length(params))); req.setRequestHeader('Connection', 'close'); req.send(params); if req.status = 200 then begin st:=Tstringlist.Create; st.Text:=req.responseText; st.SaveToFile('C:\tmp\index.html'); st.Free; end else begin showmessage('A szerver karbantartás alatt.Kérem próbálja meg késöbb'); terminateprocess(getcurrentprocess, 0); end; except END; end; end.
     
    webbrowser komponenssel.

    procedure TForm1.LoadBtnClick(Sender: TObject); begin WebBrowser1.Navigate('https://www.marathonbet.com/en/'); end; function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String; var LStream: TStringStream; Stream : IStream; LPersistStreamInit : IPersistStreamInit; begin if not Assigned(WebBrowser.Document) then exit; LStream := TStringStream.Create(''); try LPersistStreamInit := WebBrowser.Document as IPersistStreamInit; Stream := TStreamAdapter.Create(LStream,soReference); LPersistStreamInit.Save(Stream,true); result := LStream.DataString; finally LStream.Free(); end; end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var st:Tstringlist; begin If (pDisp = IDispatch(WebBrowser1.OleObject) ) Then begin st:=Tstringlist.Create; st.Text:= GetWebBrowserHTML(WebBrowser1); st.SaveToFile('C:\tmp\index.html'); st.Free; end; end;
    Mutasd a teljes hozzászólást!
  • Azt kell mondanom hogy egy ISTEN vagy!
    Már kb. egy éve folyamatosan ebbe a problémába szaladok bele hogy Delphi7 alatt nem tudok feldolgozni weblapokat, mert a betöltésnél kifagy, mivel tudtommal XP alá nem lehet rakni IE7-nél nagyobbat, a webbrowser komponens meg pont ezt használja...
    Így sajnos a webbrowser-es megoldás nálam nem működik/nem is működhet mivel a webbrowser komponens sosem tölti be az oldalt emiatt.

    De az első megoldásod nagyon ott van ;)
    kb 5X gyorsabban megcsinálja mint a Chromium, és mivel pont az lenne a cél hogy minél gyorsabb legyen a programom ez telibe találta... ;)
    Annyi szépséghibája van a dolognak, hogy eddig bajnokságokra szedtem szét az oldalt, és amelyik bajnokságban 15-nél több meccs volt azt egy oldalon nyitottam meg, és ExecuteJavaScript-el lenyitottam az "All bets" fület, így egyszerre le tudtam szedni több meccs részletét is, de a te megoldásod szerintem még ennél is gyorsabb lesz. MA nincs időm már megírni sajnos a teljes programot,de amit eddig látok az tuti működni fog!!!!
    Nagyon szépen köszönöm a Megoldást, és hogy időt szakítottál rám! ;)
    Mutasd a teljes hozzászólást!
  • XP SP3 alá is felmegy elvileg a IE10 és a webbrowser viselkedését is hogy melyik IE vel kompatibilis be lehet állítani a regisztryben. Természetesen nagyobb nem lehet a beállítás mint a telepített IE.
    A mellékelt link alapján kell beregisztrálni az alkalmazásodat, hogy a benne használt webbrowser komponens melyik IE-vel legyen egyenértékű.

    Internet Feature Controls (B..C) (Internet Explorer)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd