Newsgroup: it.comp.lang.visual-basic
Titolo: funzione sleep "economica"

salve a tutti,
ho scritto un applicativo in vb.6 che necessita di attendere l'esecuzione di 
un programma esterno, per far questo uso una funzione sleep che esegue tot 
iterazioni fino al termine stabilito oppure fino a quando il programma 
esterno � occupato... purtroppo i continui loop utilizzano moltissime 
risorse del sistema ed il pc � continuamente sovraccarico..
esiste un metodo per  mettere in pausa l'esecuzione del codice evitando di 
entrare in un loop? (ho provato anche l'API sleep ma a prestazioni il 
risultato � lo stesso... oppure per limitare il numero di loop ad eseguire 
delle operazioni in adodb ad ogni iterazione utilizzando una connection che 
punta ad un database temporaneo ma anche in questo modo le prestazioni 
calano notevolmente...) non so cosa inventarmi....
Matteo

 calano notevolmente...) non so cosa inventarmi....
Ma una sleep di 5 secondi di fila ti darebbe problemi?
Io farei un bel for con una sleep di 5 secondi. Le risorse consumate 
sarebbero prossime allo zero.
In alternativa usa un timer.
Nicola

> risultato � lo stesso... oppure per limitare il numero di loop ad 


 sleep...
Per me sbagli qualcosa. La sleep non occupa risorse. Altrimenti che 
sleep sarebbe!
Copia-incolla qui il codice che usi quando fai la sleep.
Nicola

 che passano dalla sleep...
Evita la sleep api, ho riscritto parte di un programma che la usava e 
proprio
a causa sua quando il PC la usava il sistema rallentava spaventosamente.
Io uso un approccio diverso:
Public Sub Pausa(SecondiDiPausa)
  Dim Contatore As Integer
  Dim Tempo As Date
  Contatore = 0
  Tempo = Now
  Do
    If Tempo <> Now Then
       Contatore = Contatore + 1
       Tempo = Now
    End If
    DoEvents
  Loop Until Contatore >= SecondiDiPausa
End Sub

 sleep sarebbe!
se la API sleep che dice lui e' la sttessa che ho visto io, ti inchioda il 
PC... 

> ingestibile perch� ho un'infinit� di chiamate diverse che passano dalla


 End Sub
Questo si che non occupa risorse...
Geniale.
L'hai inventato tu o l'hai trovato sul web?
Alberto
-- 
Lï¿œo Campion: Il lavoro ï¿œ l'occupazione di chi non ha nulla da fare.

> la cosa diventa ingestibile perch� ho un'infinit� di chiamate diverse


 risorse del sistema ed il pc � continuamente sovraccarico..
Ma cos'� che attendi?
Un eseguibile che si chiuda? Magari lanciato da te?
Hai provato a cercare la funzione ShellAndWait?
Ho visto internamente fa uso di questa api:
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
        hHandle As Long, ByVal dwMilliseconds As Long) As Long
Anche se comunque va messa in un ciclo in qualche modo...

 il PC...
Ma scusate. Io continuo a non capire.
1-crei un progetto Exe
2-aggiungi un modulo
3-nel modulo inserisci la seguente dichiarazione:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
4-nel form_load inserisci il seguente comando
Sleep (10000) '10 secondi
5-lanci il programma
Cpu occupata 0%
Nicola


No, scusa, quella non ï¿œ la sleep.
Quelli sono n-mila doevents (che consumano tantissima CPU!) tanti quanti 
sono i millisecondi che vuoi attendere.
E' diverso. La sleep la trovi nel mio post.
Nicola

 ha scritto nel messaggio 
news:4a97af2b$0$699$5fc...@news.tiscali.it...



i doevents occupano risorse?.... a me risulta che i doevents lasciano il pc 
libero di fare quello che vuole durante un loop... 

 L'hai inventato tu o l'hai trovato sul web?
*dovrebbe* (dato che la uso da tanto tempo)
essere farina del mio sacco... 

 (Now() varia ad ogni millisecondo)
nemmeno: now contiene data e ora, e varia ad ogni SECONDO, ti confondi
forse con il "timer" ?

 libero di fare quello che vuole durante un loop...
I doevent hanno un sensibile overhead e vanno utilizzati solo quando 
necessario, cioï¿œ per mantenere reattiva l'applicazione.
Nicola

 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Si, ma mettici un picturebox con una bitmap dentro, autoredraw = true, poi
prova a spostare la finestra mentre e' in sleep e dimme che succede....

 pc libero di fare quello che vuole durante un loop...
I Doevents consentono il processo della coda messaggi di Windows. Che non 
significa fare niente.
 

 Anche se comunque va messa in un ciclo in qualche modo...
La stessa cosa che stavo per scrivere io.
Se l'eseguibile lo lancia lui, ShellWait � senza dubbio la soluzione migliore.
-- 
S.

"Franz_aRTiglio" <fran...@N0SPAMtin.it> ha scritto nel messaggio 
news:h78cfj$e56$1...@aioe.org...

prova a fare
debug.print cdbl(Now()), cdbl(Now() + 1/24/60/60/1000)
"il" timer varia ad ogni centesimo di secondo...


l'esigenza era appunto mantenere reattiva l'applicazione e permettendo 
l'esecuzione di altre operazioni (ma anche il sistema)
in ogni caso provvedo a temporizzare anche il doevents grazie per la dritta 

"Franz_aRTiglio" <fran...@N0SPAMtin.it> ha scritto nel messaggio 
news:h78cu4$enj$1...@aioe.org...

esatto...
un loop con uno sleep massimo di 300 millisecondi + doevents credo che 
risolva tutti problemi
grazie a tutti
Matteo

"Stevie" <jstevie__@__gmail__.com> ha scritto nel messaggio 
news:qROlm.16155$Tq6....@tornado.fastwebnet.it...

conosco questo metodo ma non � il mio caso, eseguo (e piloto) 
InternetExplorer tramite la libreria ShDocVw e devo attendere il caricamento 
delle pagine web 


Non vorrei sbaglarmi, ma mi pareva che l'intervento di Albe fosse vagamente
ironico :-P

 in ogni caso provvedo a temporizzare anche il doevents grazie per la dritta
Allora c'ï¿œ qualcosa che non va nella tua applicazione.
Se l'applicazione deve fare qualcosa, e nel mentre una funzione sta 
girando, la soluzione non sono sleep + doevents ogni 300 millisecondi.
La soluzione ï¿œ utilizzare i Thread.
Procedendo di sleep e doevents vai ad infilarti in un vicolo cieco.
Nicola

 prova a fare
[cut]
Nel modo in cui  l'ho implementato io la variazione considerata e' in 
secondi. 

 Nicola
purtroppo non conosco i thread... il mio obbiettivo � quello di permettere 
all'utente di eseguire semplici operazioni coome aprire una form, inserire e 
visualizzare dati mentre l'applicazione lavora in backgroud con IE, sto 
testatndo la combinazione sleep e doevents nella speranza che il sistema sia 
meno sovraccarico e l'applicazione garantisca l'esecuzione di quelle 
semplici operazioni....
p�o funzionare??
Matteo


Non saprei; pero' incuriosido dal 3ad ho cercato i miei primi
passi in merito bnella mia cartella c:\dev; dopo improbabili
computi della funzione timer (e i relativi casini dirivanti
dal suo uso dato che si riazzera a mezzanotte), arrivai
a contare i secondi come descritto, ma dato che erano
giorni che ci cristonavo sopra, non escludo che la ottenni
rielaborando (o copiando) qualcosa trovato 
in giro per la rete... anche perche' il concetto di base
e' talmente semplice che e' prono ad essere "inventato"
da piu' persone senza che nessuno abbia letto l' "invenzione"
dell'altro...

"Franz_aRTiglio" <fran...@N0SPAMtin.it> ha scritto nel messaggio 
news:h78gi2$j3g$1...@aioe.org...

uhm... � comportamento alquanto anomalo perch� facendo
debug.Print now() <> (now()+1/24/60/60/1000000)
il risultato � true non false! 

 il risultato ï¿½ true non false!
ma LOL :)
anche debug.print x <> x +1 e' true :D 

 anche debug.print x <> x +1 e' true :D
ma davvero??? forse ti sfugge qualcosa... nella tua sub Pausa confronti due 
date e passa il check solo alla variazione in secondi della variabile Tempo 
(Date) il fatto � anomalo perch� una variabile date permette di salvare fino 
al millionesimo di secondo visto che (now() <> (now()+1/24/60/60/1.000.000)) 
= True mentre (now() <> (now()+1/24/60/60/10.000.000)) = False.
Dato che l'accuratezza di Now() � al millesimo di secondo....la tua sub 
pausa... dovrebbe attendere N millesimi di secondi e non N secondi.... o 
eventualmente, se il tempo necessario per eseguire un loop � maggiore di un 
millisecondo (ma ne dubito...), il tempo necessario per eseguire N loop...
spero di essere stato piu chiaro....
Saluti.

 Dato che l'accuratezza di Now() ï¿œ al millesimo di secondo
Franz_aRTiglio ha scritto una procedura brutta inguardabile, ma il 
check del secondo ï¿œ corretto (lui confronta date, non double).
Alberto
-- 
Charles Baudelaire: C'ï¿œ un solo modo di dimenticare il tempo: 
impiegarlo.

 pï¿œo funzionare??
Cosï¿œ no. Al massimo tiri fuori un mezzo accrocchio, ma molto instabile e 
di difficile manutenzione.
Se lavori con VB6, ecco un tutorial per lavorare con i thread:
http://www.vbsimple.net/index.htm?/howto/ht_030.htm
Nicola

 Franz_aRTiglio ha scritto una procedura brutta inguardabile,
ay que dolï¿œr....

 Nicola
Se parliamo di VB6, sinceramente credo sia più stabile il "mezzo
accrocchio" che non usare i thread... proprio la fine dell'articolo
che hai postato, per esempio, non è delle più incoraggianti
in .NET allora siamo d'accordo.

 in .NET allora siamo d'accordo.
Eh beh... in .NET � un altro pianeta!
Nicola

 ha scritto nel messaggio 
news:4a97ef38$0$6833$5fc...@news.tiscali.it...

� gia vb6 anzi access, ma il vba � praticamente uguale al vb6 con il 
vantaggio di essere piu sbrigativo... passatemela :D
ho risolto con l'accrocchio e tutto sommato non � malaccio... direi che 
lascio le cose cosi anche perch� questa applicazione la usero solo io e 
qualche amico... 


ok il messaggio � chiaro ... la variabile date ha un'accuratezza maggiore 
del risultato di Now() che � al secondo.... devo usare timer()...

 risultato di Now() che ï¿œ al secondo....
Questo dove l'hai letto?
A me risulta che le variabili Date abbiano precisione al secondo (che 
poi, essendo floating, ï¿œ un concetto molto piï¿œ profondo, ma prendiamolo 
per buono).
E Now() restituisce un Date, quindi con precisione al secondo.
Ciï¿œ che stavo dicendo ï¿œ che il tuo operatore <> stava operando 
comparando due Double, non due Date, e quindi era abbastanza evidente 
che x <> x + qualcosa...
Alberto
-- 
Karl Marx: Uno scrittore ï¿œ produttivo non nella misura in cui produce 
idee, ma nella misura in cui arricchisce l'editore che pubblica le sue 
opere.


non l'ho letto da nessuna parte...
debug.Print cdate(now+1/24/60/60/1000)<> cdate(now+1/24/60/60)