Newsgroup: it.comp.lang.visual-basic
Titolo: Timer e W2000

Qualche giorno fa ho suggerito per un timer il codice che riporto più
sotto. Qualcuno mi fece notare che il ciclo principale non era
"elegante", e di usare SetTimer.
Oggi scopro un altro grave problema...
Il codice gira su almeno una ventina di macchine W9x per eseguire una
serie di backup programmati, e non ha mai dato problemi; l'ho
installato anche su una macchina W2000, ma dopo qualche giorno un
altro software ha cominciato a dare problemi gravi (query lentissime,
DB rovinati !!) e la causa mi sembra essere proprio il software di
backup, che impegna una gran parte delle risorse della CPU. Tolto il
software di backup tutto sembra OK.
Qualcuno sa dirmi perchè? 
Suggerimenti?
Come funziona l'uso di SetTimer, KillTimer, ecc. ? 
Risolve i problemi con W2000, WNT
ErreBi
Codice "incriminato":
Principale:
'------------------------------------------------------------------
EOra(0)
do while EOra<=TempoDaAspettare    'In millisecondi
	doevents
loop
... continua
Funzione accessoria:
'------------------------------------------------------------------
Public Declare Function GetTickCount Lib "kernel32" () As Long
Funzione timer:
'------------------------------------------------------------------
Public Function EOra(ByVal Pausa As Long) As Boolean
    Static Inizio As Long
    Dim t As Long
    If Inizio = 0 Then        'In questo caso azzera
        Inizio = GetTickCount
    End If
    t = GetTickCount
    If (t - Inizio) >= Pausa Then
        EOra = True
        Inizio = 0              'Azzera
    Else
        EOra = False
    End If
End Function

 wrote in message
news:hhd5vs4sb1qhn55p8...@4ax.com...


Suggerimenti?
[CLIP]
1) L'esempio che hai proposto non usa SetTimer
2) L'esempio che hai proposto da alta precisione, ma.. occupa molto la
macchina.
3) Ma perchč non usi un normalissimo oggeto Timer?
Sappi che l'oggetto timer usa SetTimer(), e quindi non cambia nulla se ti
metti a usare tu direttamente SetTimer() se non che ti complichi la vita per
niente.
L'oggetto Timer standard č quanto di piu' impreciso ci sia al mondo, ma il
suo errore puo' essere compunque nei peggiori casi di un paio di secondi
(esagerando). Non credo proprio che tu devi fare un Backup ogni 1/50 di
secondo, a massimo ogni 10 minuti, e quindi che male c'e' nell'usare il
timer?
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

 wrote in message
news:8t280j$5uj$1...@fe1.cs.interbusiness.it...


3) Ma perchè non usi un normalissimo oggeto Timer?
Il motivo per cui ho usato questa tecnica è che il timer deve agire
per tempi lunghi ...
E' meglio usare un contatore di eventi Timer, e costruirsi una
funzione che agisca per ore e/o giorni ? Magari con qualche rettifica
opportuna per i secondi persi ?
Magari provo e poi vi faccio sapere ... ErreBi

W2000 mi da seri problemi?
Problema conosciuto.
A me e' capitato un programma client che su win9x tutto ok ma sotto nt le
stampe rallentavano pesantemente.
Tutti i sistemi nt (4.0, 2000, eccc.) sono molto sensibili ai loop di
attesa, sono da evitare come la peste, possono rallentare tantissimo i
processi con priorita' inferiore.
Da quel poco che ho capito e' diversa la gestione delle priorita' e della
divisione del tempo dei vari processi in nt.
Credo che aumenti la priorita' dei processi in fase di input per far
sembrare che il sistema risponde velocemente e quindi se un processo e' in
input continuo (loop) ciao ciao risorse.
Salve
                                    Dbg

 wrote in message
news:8t65p1$qef$1...@fe2.cs.interbusiness.it...


...



Scusa il ritardo.
Si, se usi un contatore di eventi, gli errori si sommano, ma
c'e' un semplicissimo trucco per mantenere la precisione anche
con lunghi periodi: basta guardare che ore sono.
Immagina di impostare un timer con cadenza ad ogni secondo.
E poi di fare:
Dim OrarioBase As Date
Private Sub Form_Load()
    OrarioBase = Now
End Sub
Private Sub Timer1_Timer()
    If DateAdd("n", 60 * 8, OrarioBase) >= Now Then
        ' SONO PASSATE 8 ORE,
        ' SCATENO L'EVENTO
        ..
        ..
        OrarioBase = Now
    End If
End Sub
In questo modo qualsiasi sia il tempo di attesa, avrai comunque la
precisione del secondo.
