Seite 2 von 3

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 17:10
von Delle
mk-soft hat geschrieben:Das problem ist, wann das Webgadget wirklich fertig ist mit den Laden der Webseite...
Das sieht ja superschick aus! :allright:

Achso das wird gar nicht abgefragt, ob die jeweilige Seite schon fertig mit laden ist?

Dachte das macht das hier: WaitSemaphore(SendData\Semaphore)

Das Delay von Dir is also nur Pseudo sozusagen? Sonst würde er alles asynchron durchrasseln oder?

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 17:50
von Delle
Also das produziert immer noch 60% CPU:

Code: Alles auswählen


Enumeration
  
  #DB
  #Browser
  
EndEnumeration

InitNetwork()

; ...

OpenWindow(0, 0, 0, 1600, 900, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)

WebGadget(#Browser, 10, 45, 1580, 645, "about:blank"):MyWebGadget.IWebBrowser2=GetWindowLong_(GadgetID(#Browser),#GWL_USERDATA):MyWebGadget\put_Silent(#True):SetGadgetAttribute(#Browser,#PB_Web_BlockPopups,1)
  DisableGadget(#Browser,1)

Repeat 

If DatabaseQuery(#DB, "SELECT * FROM tabelle")
        
      While NextDatabaseRow(#DB)
        
        SetGadgetText(#Browser,GetDatabaseString(#DB, DatabaseColumnIndex(#DB, "url")))
            
        StartTime.q = ElapsedMilliseconds()
            
        While GetGadgetAttribute(#Browser, #PB_Web_Busy)
          While WindowEvent():Wend
          
          If(ElapsedMilliseconds() - StartTime)>60000
            Debug "anscheinend hängengeblieben
            Break
          EndIf
        Wend
        
 EndIf
  
ForEver

Ich hab jz schon extra alle User-Gadgetinteraktionen rausgenommen.

Dumme Schleife die sofort losläuft und Abbruch nur mittels Taskmanager zulässt.

Selbst das hier brauch 50-60% CPU:

Bild

Code: Alles auswählen

pausi.l = Random(1000*60*3,1000*60*1)
                          
              StartTime.q = ElapsedMilliseconds()
              
               Repeat
                 
               Until (pausi + StartTime)<ElapsedMilliseconds()

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 19:57
von mk-soft
Nur mit einen WaitWindowEvent() oder mit eine Delay(x) bekommst du die Last runter...

Die dachte auch das mit den Event '#PB_EventType_DownloadEnd' alles geladen ist.
Dem scheint aber nicht so zu sein.
Beim setzen des Browser auf "http://t-online" kommen mehrere Events '#PB_EventType_DownloadStart' und '#PB_EventType_DownloadEnd'
Nach dem ersten Event von '#PB_EventType_DownloadEnd' geht der Thread in 5 Sekunden Pause, bevor die nächste Seite abgerufen wird.
In dier Zeit kamen mehrere Events von WebGadget an...

Keine Ahnung warum! Vielleicht werden mehrere verschiedene Seiten geladen.

So geht die CPU last runter

Code: Alles auswählen


pausi.l = 60000; 1 Minute

StartTime.q = ElapsedMilliseconds()

Repeat
  Delay(10)
Until (pausi + StartTime)<ElapsedMilliseconds()

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 20:05
von Kiffi
@Delle:

Wenn ich mir Deinen Code so ansehe: Was willst Du denn eigentlich damit machen?

Webseiten herunterladen (vielleicht um sie zu analysieren)?

Für solch eine Aufgabe eignet sich das WebGadget denkbar schlecht. Besser hierfür wäre beispielsweise ReceiveHTTPMemory() geeignet.

Grüße ... Peter

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 20:07
von Delle
mk-soft hat geschrieben:Nur mit einen WaitWindowEvent() oder mit eine Delay(x) bekommst du die Last runter...
WaitWindowEvent() wartet ja dann aber tatsächlich auf irgendein Ereignis oder? Findet ja nicht wirklich statt.

Und zu "große" Delayzeiten á la Delay(10000) scheinen das Programm vorübergehend einzufrieren (im Taskmanager "inaktiv").

Also lieber eine Schleife mit vielen kleineren Delays?
mk-soft hat geschrieben:Keine Ahnung warum! Vielleicht werden mehrere verschiedene Seiten geladen.
Das sind anscheinend PopUps und iFrames!

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 20:10
von Delle
Kiffi hat geschrieben:@Delle:

Wenn ich mir Deinen Code so ansehe: Was willst Du denn eigentlich damit machen?

Webseiten herunterladen (vielleicht um sie zu analysieren)?
Richtig! Eigentlich brauch ich nur den HTML-Quellcode.
Kiffi hat geschrieben:Für solch eine Aufgabe eignet sich das WebGadget denkbar schlecht. Besser hierfür wäre beispielsweise ReceiveHTTPMemory() geeignet.

Grüße ... Peter
Das hatte ich PHP-seitig monatelange so laufen, bis der Webseitenbetreiber Captchas usw. eingebaut hat.

Mittels der PB-Network-Befehle wird man sofort als "Roboter" erkannt, auch wenn man mittels Curl, HTTP_Agent usw. ziemlich "echt" dort ankommt.

Beim Webgadget meckert er allerdings nicht rum... ist sozusagen der letzte Ausweg :(

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 20:12
von mk-soft
WaitWindowEvent hat noch einen optionalen Parameter...

Code dir mal angepasst ohne test test test

Code: Alles auswählen

Enumeration
  
  #DB
  #Browser
  
EndEnumeration

InitNetwork()

; ...

OpenWindow(0, 0, 0, 1600, 900, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)

WebGadget(#Browser, 10, 45, 1580, 645, "about:blank"):MyWebGadget.IWebBrowser2=GetWindowLong_(GadgetID(#Browser),#GWL_USERDATA):MyWebGadget\put_Silent(#True):SetGadgetAttribute(#Browser,#PB_Web_BlockPopups,1)
  DisableGadget(#Browser,1)

Repeat 

If DatabaseQuery(#DB, "SELECT * FROM tabelle")
        
      While NextDatabaseRow(#DB)
        
        SetGadgetText(#Browser,GetDatabaseString(#DB, DatabaseColumnIndex(#DB, "url")))
            
        StartTime.q = ElapsedMilliseconds()
        
        While WaitWindowEvent(20) ; Alle 20 Millisekunken durchlaufen lassen <- Siehe PB-Hilfe
          If GetGadgetAttribute(#Browser, #PB_Web_Busy)
            If (ElapsedMilliseconds() - StartTime)>60000
              Debug "anscheinend hängengeblieben
              Break
            EndIf
          Else
            Debug "Seite geladen..."
            Break ; vertik ;)
          EndIf
        Wend
      Wend
 EndIf
  
ForEver

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 21:29
von Kiffi
Delle hat geschrieben:Beim Webgadget meckert er allerdings nicht rum... ist sozusagen der letzte Ausweg :(
mh, kann sein, dass die Seite gerendert (bzw. das in der Seite enthaltene JavaScript ausgeführt) werden muss, um die richtigen Daten zu liefern.
Das kann dann natürlich ein ReceiveHTTPMemory() ebenso wenig wie ein PHP, cUrl, etc. Dafür braucht es dann in der Tat einen Browser.
Du kannst Dir ja mal PhantomJS anschauen.

Grüße ... Peter

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 23:33
von TroaX
mk-soft hat geschrieben:Die dachte auch das mit den Event '#PB_EventType_DownloadEnd' alles geladen ist.
Dem scheint aber nicht so zu sein.
Beim setzen des Browser auf "http://t-online" kommen mehrere Events '#PB_EventType_DownloadStart' und '#PB_EventType_DownloadEnd'
Nach dem ersten Event von '#PB_EventType_DownloadEnd' geht der Thread in 5 Sekunden Pause, bevor die nächste Seite abgerufen wird.
In dier Zeit kamen mehrere Events von WebGadget an...

Keine Ahnung warum! Vielleicht werden mehrere verschiedene Seiten geladen.
Sobald auf einer Webseite weitere Ressourcen wie Bilder, exerne Scriprts oder Stylesheets verwendet werden, müssen diese nachgeladen werden. Ein Brwoser sowie das Webgedget holt sich im ersten Schritt das DOM sowie den Inhalt den statischen Inhalt der Seite. Im nächsten Schritt wird das ganze geparst und weitere Ressourcen ermittelt. Sobald er damit fertig ist, fängt er an, mit weiteren Request's die Ressourcen nachzuladen. Und aus diesem Grund bekommst du auch mehrfach das DownloadEnd Event.

Ich glaube mit GetGadgetItemText(#Browser, #PB_Web_StatusMessage) kommst du eher weiter. Ich habe es lange nicht mehr verwendet. Aber im Regelfall meldet, so lange das Gadget arbeitet den Text "BUSY" zurück. Einfach mal testen.

Re: 60% CPU-Auslastung trotz WaitWindowEvent()?

Verfasst: 07.08.2018 23:48
von Delle
TroaX hat geschrieben:Ich glaube mit GetGadgetItemText(#Browser, #PB_Web_StatusMessage) kommst du eher weiter. Ich habe es lange nicht mehr verwendet. Aber im Regelfall meldet, so lange das Gadget arbeitet den Text "BUSY" zurück. Einfach mal testen.
Das liefert allerlei Stati wieder, nur "busy" nicht.

Manchmal auch "Fertig", wo aber nach paar Millisekunden noch "Bild" usw. nachgeladen werden.

Eigentlich brauch ich ja nur das HTML, der Rest ist mir unwichtig.

Aber anscheinend muss echt erst ALLES geladen sein, damit ich dann drauf zugreifen kann.

Leider kann man nicht einfach den Sourcode via Webgadget so anzapfen:

view-source:https://www.purebasic.com/german/docume ... adget.html