Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB2008] Ridurre utilizzo CPU se possibile

    Salve a tutti voi del forum.
    Ho appena finito di fare un programma che esegue delle navigazioni in automatico in un webbrowser e a seconda dei valori che legge dal sorgente della pagina del sito, esegue determinate procedure.
    Funziona tutto egregiamente bene, solo che questo programma utilizza in maniera spropositata la CPU. Aprendo un'istanza sola del programma viaggia in media sul 20% di utilizzo della CPU e fino a dei picchi di utlizzo del processore del 30%. Visto che io ho la necessità di aprire più istanze di questo programma (anche 10) capirete che dopo l'apertura di 3 istanze il processore è già praticamente al 90%, il che mi impedisce di aprirne altri.
    Va detto che all'interno del programma vi sono dei cicli For e While(i quali raggiungono un livello di annidamento massimo uguale a 2), dove il While è utilizzato per creare un ritardo, mentre i For servono per fare delle ricerche nel codice sorgente.

    Fosse la mia applicazione applicazione molto potente come un gioco di ultima generazione o un programma di ritaglio video, allora potrei pensare che il processore possa andare tranquillamente ad un livello di utilizzo molto alto, ma da un programmino fatto da me in VB2008 non mi posso aspettare un utilizzo del genere.

    Ora chiedo a voi: avete qualche idea su come è possibile fare in modo che il processore sia utilizzato meno?

    Grazie in anticipo. Ogni aiuto o consglio è ben gradito.

    P.S. Se vi servono ulteriori informazioni scrivetemelo.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Inserisci una chiamata al metodo Thread.Sleep all'interno del ciclo, in modo da rilasciare periodicamente la CPU ad altri processi (passando 0, zero, come valore).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Sostituisci i While usati per creare ritardo (tecnica che aveva senso forse ai tempi del Commodore 64) con delle adeguate chiamate a Thread.Sleep.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Innanzitutto vi ringrazio per i consigli che mi avete dato.
    Seguendo i vostri consigli ho messo un po' sparso per tutto il programma la seguente riga di codice:

    codice:
     
    System.Threading.Thread.Sleep(0)
    La quale se non ho capito male, sospende il thread corrente e consente ad un altro thread in coda di essere eseguito. Effettivamente dei miglioramentei ci sono stati (ovvero riesco ad aprire molte più istanze rispetto a prima e di media l'utilizzo della CPU è sull' 11% e picchi del 20% a istanza).

    Io i cicli di ritardo li faccio nel segunete modo:
    codice:
    Dim time As DateTime = Now
            Dim sec As Integer = tempo
    
            While sec > Now.Subtract(time).TotalSeconds
                Application.DoEvents()
            End While
    Qual è l'altra maniera più performante per fare questi ritardi?
    Sono per caso questi che impegnano molto la CPU?

    Grazie in anticipo

  5. #5
    Originariamente inviato da grimaldello
    Io i cicli di ritardo li faccio nel segunete modo:
    codice:
    Dim time As DateTime = Now
            Dim sec As Integer = tempo
    
            While sec > Now.Subtract(time).TotalSeconds
                Application.DoEvents()
            End While
    Qual è l'altra maniera più performante per fare questi ritardi?
    Sono per caso questi che impegnano molto la CPU?
    1. A cosa ti servono questi ritardi? All'interno di che codice sono eseguiti?
    2. Il codice in questione lavora nel thread che gestisce l'interfaccia o è un thread che lavora in background?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    In pratica avvio il mio programma contenente un webbroser e dei pulsanti messi da me.
    Con un pulsante effettuo il login all'interno del sito.
    Una volta eseguito il login, attraverso gli altri pulsanti scelgo cosa fare all'interno del sito.
    Ad esempio con il pulsante1, il programma naviga in una certa pagina e ciclicamente controlla se cambiano dei valori all'interno del sorgente e di conseguenza prende delle decisioni.

    Ora se queste operazioni eseguite in automatico sono fatte troppo velocemente, il sito mi informa che sto eseguendo troppe richieste velocemente e mi rimanda ad un link particolare che mi informa di ciò e mi blocca il tutto. Per questo sono costretto a mettere quei cicli di ritardo.

    Il programma agisce appunto su un webbrowser e anche su di un database immagini che ho salvato nell'hard disk. Al verificarsi di determinati eventi, viene avviata la procedura per il confronto delle immagini (che viene fatta con dei For annidati per il confronto pixel a pixel) e poi i risultati vengono messi in un form della pagina web del sito.

    Le uniche cose che lavorano in background sono:
    -un programmino da riga di comando, il quale prende il codice sorgente della pagina e lo trasforma in una Jpeg, solo se si verificano determinati avvenimenti.

    -un altro programmino da riga di comando (ImageMagick) il quale esegue delle operazioni di ritaglio dell'immagine presa precedentemente

    Spero di aver spiegato un po' meglio.


  7. #7
    Io effettuerei il polling sul sito da un thread secondario che lavori in background, così si può mettere in pausa per un tot di secondi con Thread.Sleep senza che si blocchi il thread che gestisce la grafica; in alternativa, userei un componente timer per far richiamare la funzione che controlla le modifiche alla pagina ciclicamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Ok grazie dei consigli.
    Li proverò e ti saprò dire.

    Grazie ancora.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.