60% CPU-Auslastung trotz WaitWindowEvent()?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

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

Beitrag 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?
PB 6.02 LTS + Win 11
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

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

Beitrag 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()
PB 6.02 LTS + Win 11
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
Hygge
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

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

Beitrag 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!
PB 6.02 LTS + Win 11
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

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

Beitrag 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 :(
PB 6.02 LTS + Win 11
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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
Zuletzt geändert von mk-soft am 07.08.2018 21:50, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
Hygge
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

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

Beitrag 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.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
Delle
Beiträge: 1118
Registriert: 10.05.2005 22:48

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

Beitrag 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
PB 6.02 LTS + Win 11
Antworten