Newsgroup: it.comp.lang.visual-basic
Titolo: Cicli di attesa senza sovraccaricare la cpu

Esiste un modo (diverso dall'uso dei timers) per ritardare
l'esecuzione di un comando di x secondi senza che la cpu schizzi al
100% e il pc si "sieda"?  Mi succede sia con cicli di doevents sia con
sleep...Suggerimenti?

Suggerimenti?
Pubblica il codice che usi, il casino e' li'.
-- 
ciao, un hal di passaggio

 ha scritto nel messaggio
news:aidr701nhkc5noau3...@4ax.com...

Con cicli di DoEvents e' normale... la soluzione "classica" e' proprio
quella di combinare DoEvents e Sleep in un numero di iterazioni contenuto
usando piccole pause in sequenza, nell'ordine del decimo di secondo: in
questo modo dovresti restare grosso modo sotto il 5% di occupazione e
contemporaneamente non bloccare il refresh della tua applicazione come con
un singolo Sleep
'Pausa di 2 secondi
For i = 1 To 20
    Sleep 100
    DoEvents
Next
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 un singolo Sleep
Uhm.. ma se si usa un controllo timer a n millisecondi, alal cui 
abilitazione si annullano tutti gli eventi sui controlli utilizabili e 
li ri ripristinano al tick si dovrebbe portare l'utilizzo->0%... Sbaglio?
Disgusting Angel

 li ri ripristinano al tick si dovrebbe portare l'utilizzo->0%... Sbaglio?
Non sbagli, ma l'evento e' asincrono e il codice per ottenere il tutto
potrebbe essere piu' elaborato di quello che mostravo prima... inoltre hai
bisogno di piazzare un controllo in una form, oppure di scomodare le
funzioni dell'API SetTimer/KillTimer con relativa funzione di callback: il
"giochino Sleep+DoEvents" invece sono quelle 4-righe-4 e puoi metterlo in un
modulo o in una classe e riciclarlo all'infinito.



Io farei così:
Public Sub Wait(ByVal nSec As Long)
Dim Ora As String
     If nSec > 0 Then
         Ora = DateAdd("s", nSec, Format$(Now, "hh:mm:ss"))
         Do
             DoEvents
             Sleep 100
         Loop Until Format$(Now, "hh:mm:ss") >= Ora
     End If
End Sub
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

 End Sub
Dato che la pausa di 100 ms che hai scelto e' fissa, sai gia' quante
iterazioni ti servono; invece di lavorare sull'ora e ora basta un semplice
For i = 1 To nSec * 10


Pubblica il codice che usi, il casino e' li'.
Public Function AttendiSecondi(Secondi_da_Attendere As Double) As
Boolean
 
    Dim vTime As Date
    vTime = DateAdd("s", Secondi_da_Attendere, Time)
 
    Do Until Time > vTime
 
        DoEvents
        Sleep (50)
        DoEvents
 
    Loop
 
End Function

 Ciao


 For i = 1 To nSec * 10
Stai scherzando vero?
Lokar.basito
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 Lokar.basito
No, affatto: se non ti serve una precisione particolare, lo scarto
introdotto da DoEvents e' trascurabile e la routine si ferma per il tempo
stabilito e consuma pochi cicli come chiesto.
Giusto per provare, ho fatto piu' test mentre stavo facendo il defrag di un
disco e zippando 500 Mb sull'altro e la precisione e' rimasta a livelli
accettabili, anche con pause lunghe (30 sec)...
Ad ogni modo il sistema proposto con Loop+Now e' altrettanto e anche piu'
impreciso (1 secondo e 99 centesimi vengono considerati come 1 secondo e 1
centesimo), ed andrebbe in ogni caso rimpiazzato con Loop+GetTickCount o
simili


 [SNIP]
Chiedo venia, ho "letto male" ed ho inteso che ciclassi _senza_ Sleep, ma
contando "il numero di cicli necessari per la pausa" ed utilizzando quelli.
Naturalmente rileggendoti mi sono accorto della mia svista e concordo con
quanto hai scritto =). Scusa ancora =)
Lokar
