Condividi tramite

Timer e barre di scorrimento

Anonimo
2012-06-29T20:27:21+00:00

Ciao David,

"qualche giorno" fa per contare il tempo impiegato per sviluppare dei dati hai usato la funzione Timer:

Dim lngTimer As Single

lngTimer = Timer

...

MsgBox "Tempo trascorso per annullare i dati: " & (Timer - lngTimer) & " secondi"

Bene,

per popolare una tabella e vedere il tempo impiegato:

Dim rs As DAO.Recordset

Dim i As Long

Dim lngTimer As Single

lngTimer = Timer

CurrentDb.Execute "Delete * From Tabella1"

Set rs = CurrentDb.OpenRecordset("Tabella1")

i = 1

For i = 1 To 200000

rs.AddNew

rs!Progressivo = i

rs.Update

Next i

MsgBox "Tempo trascorso: " & (Timer - lngTimer) & " secondi"

rs.Close

Set rs = Nothing

il tempo è sempre diverso:

6,585938

6,617188

6,75

C'è la possibilità di avere sempre lo stesso tempo?

Grazie Vladimiro.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2012-07-03T22:39:43+00:00

Ciao Giorgio,

no, non è una questione di grafica; anzi, mentre quella più veloce è rappresentata da una maschera con in mezzo un'etichetta in cui si forma man mano una barra fino alla fine dell'etichetta, quest'altra più lenta si presenta nella barra di stato. E' uguale a quella che esce automaticamente quando si tenta di aprire una query con parecchi dati.

Siccome la progress bar la uso sempre nel momento in cui un determinato sviluppo di dati (certamente più complesso di quello dell'esempio) supera un certo periodo di tempo, mi farebbe piacere sapere come ridurre man mano i 190000 records a 500.

Grazie Vladimiro.

Ciao Vladimiro,

vabbè tu dici che non è una questione di complessità grafica ma il punto non è questo.

Una qualsiasi funzione richiede un determinato tempo di esecuzione, poniamo il caso che la funzione della barra di scorrimento richieda il tempo di 1 millisecondo, con 190.000 record si spendono 190 secondi (3 minuti circa) con 1.000.000 di record si spendono 1.000 secondi (circa 16 minuti).

E' evidente che il problema non è il tempo richiesto dalla funzione, ma il modo in cui la usi.

Potresti richiamare solo 100 volte la funzione spendendo 100 millisecondi (1 decimo di secondo) e ottenere lo stesso effetto.

Guarda questo semlice esempio tratto dal tuo codice a cui ho apportato poche modifiche.


Dim Rs As DAO.Recordset

Dim i As Long

Dim Step As Long

Set Rs = CurrentDb.OpenRecordset("Tabella1")

Rs.MoveLast

Rs.MoveFirst

SysCmd acSysCmdInitMeter, "Elaborazione: ", Rs.RecordCount

'Richiamo la SysCmd 100 volte

Step = Rs.RecordCount / 100

i = 1

Do Until Rs.EOF

    Rs.Edit

    Rs!Progressivo = i

    Rs.Update

    If i Mod Step = 0 Then

       SysCmd acSysCmdUpdateMeter, i

    End If

    Rs.MoveNext

    i = i + 1

Loop

Rs.Close

Set Rs = Nothing

SysCmd acSysCmdClearStatus


Ciao

Giorgio Rancati

La risposta è stata utile?

0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-07-02T18:12:33+00:00

    Ciao Mauro,

    sto verificando delle barre di scorrimento (quelle che servono per ingannare l'attesa) e non riesco a capire:

    1. se rubano un pò di tempo allo sviluppo di una routine
    2. se l'una ruba più tempo rispetto all'altra

    Siccome il tutto rientra in frazioni di secondi, mi sono servito della funzione Timer sperando di capirci qualcosa rispetto al tempo di esecuzione e con mia grande sorpresa ho scoperto quello che già ho postato poco fa a David.

    Al seguente link ho inserito un esempio 

    https://skydrive.live.com/#cid=DFDFB766AA86F9D8&id=DFDFB766AA86F9D8%21112

    Ciao Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-07-02T17:54:32+00:00

    Ciao David, accolta la raccomandazione passiamo a noi :-)

    Se faccio un copia e incolla del db, ho due db con le stesse dimensioni; per cui posso dedurre che ho due copie identiche di uno stesso prodotto. Allora perchè in fase di prima esecuzione della stessa routine da entrambi i db, il tempo impiegato per lo sviluppo è diverso?

    ps:

    continuo con Mauro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-07-02T09:33:13+00:00

    il tempo è sempre diverso:

    6,585938

    6,617188

    6,75

    C'è la possibilità di avere sempre lo stesso tempo?

    Grazie Vladimiro.

    Mi sfugge il motivo di questa neccessità.

    Puoi, per favore, spiegarlo?

    Grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-07-02T08:21:06+00:00

    Ciao Vladimiro,

    prima della risposta una raccomandazione: non personalizzare le domande, rischi che altri partecipanti al forum non ti diano la risposta in quanto "esclusi" dalla tua domanda.

    Per quanto riguarda la risposta è no. Nel senso che quel calcolo vuole indicare il tempo che impiega la routine ad eseguire i compiti assegnati e non in quanto tempo quei compiti devono essere eseguiti.

    In sostanza quindi la variabilità del tempo impiegato è intrinseca e, a mio avviso, non può essere predeterminata.

    David

    La risposta è stata utile?

    0 commenti Nessun commento