Problema integrazione grafico con SleepTimer



  • Problema integrazione grafico con Sleep/Timer
    di andrea_feletto (utente non iscritto) data: 15/04/2015 19:43:10

    Ciao a tutti, sto facendo una macro che permette l'animazione di un pendolo con un grafico. La parte di goniometria è ok infatti cambiando il valore dell'angolo le coordinate del punto "mobile" cambiano correttamente. Per fare l'animazione ho bisogno di cambiare progressivamente il valore dell'angolo ma con una pausa che permetta di apprezzare il cambiamento nel tempo. Per fare ciò ho provato prima con il comando " Application.Wait (Now + TimeValue("0:00:01")) " ma il pendolo rimaneva nella posizione iniziale e alla fine della pausa (durante la quale il foglio era inutilizzabile) si "teletrasportava" a fine corsa. Ho riprovato con il comando Sleep e avveniva la medesima cosa. Penso che il problema stia nel fatto che il grafico non ha tempo per aggiornarsi. Ho voluto fare questo progetto proprio perchè l'ho visto in azione quindi è possibilissimo farlo.
     
    Private Sub CommandButton1_Click()
        Dim ang, rad, x, y, l, x0, y0 As Integer
        Dim ws As Worksheet
        Set ws = Foglio1
        
        For ang = -90 To 90
            rad = WorksheetFunction.Radians(ang)
            l = 8              'lunghezza della "corda"
            x0 = 12          'ascissa del perno
            y0 = 10          'ordinata del perno
            x = getX(rad, l, x0)
            y = getY(rad, l, y0)
            With ws
                .Range("A1").Formula = x          'scrive nelle celle da cui il grafico attinge i dati
                .Range("B1").Formula = y
            End With
            Sleep 5
            'Application.Wait (Now + TimeValue("0:00:01"))
        Next ang
        
    End Sub



  • di Luca73 data: 15/04/2015 20:04:37

    e pensare di legare l'angolo al tempo?
    Intendo decidi il tempo max (diciamo 45 secondi) poi porti il ciclo ini loop (do ....loop until tempo > tempo finale) gli fai calcolare all'inizio il tempo iniziale poi ogni 45 diviso 180 secondi gli faicambiare l'angolo con un semplice formula di sottrazione del tempo attuale rispetto a quello iniziale .






  • di andrea_feletto data: 15/04/2015 20:46:32

    Quello è lo step successivo ma prima devo risolvere il problema del tempo. Inoltre ho notato che a prescindere dalla durata della paura, e quindi dalla frequenza di incremento dell'angolo, dopo circa 3 secondi, se il processo è ancora attivo, excel si impalla e non risponde. Ciò non accade con Sleep 5 perchè il processo dura sufficientemente poco, ma con Sleep 50 si.
    In ogni caso mi sono dimenticato di dire che getX e getY sono funzioni in cui vengono calcolate le rispettive coordinate con funzioni goniometriche (seno e coseno).

    Grazie luca per la risposta.
     
    Function getX(ang, l, x0)
        getX = x0 + (l * Sin(ang))
    End Function
    
    Function getY(ang, l, y0)
        getY = y0 - (l * Cos(ang))
    End Function



  • di Mister_x (utente non iscritto) data: 16/04/2015 00:20:17

    ciao

    ti posto un file a cui stavo lavorando molto tempo fa, ma poi mi e' passata la voglia di continuare
    lobbiettivo era di creare un orologio analogico e nel suo quadrante sotto inserire anche un digitale, mi sono fermato alle semplici lancette dove queste,per girare hanno bisogno di calcoli, quindi da come vedrai forse ne potrai trarne degli spunti per i tuoi calcoli e la procedura per fare questo
    PS al mio manca il quadrante con i numeri e il digitale

    ciao





  • di oregon (utente non iscritto) data: 16/04/2015 07:20:04

    Inserisci una

    DoEvents

    Prima della Sleep



  • di lepat (utente non iscritto) data: 16/04/2015 10:09:04

    Mister_x ha allegato il file
    andrea_feletto non lo ha fatto
    chi dei due ha bisogno di aiuto ? ma .....



  • di Mister_x (utente non iscritto) data: 16/04/2015 12:00:40

    ciao lepad

    non sono io che ho bisogno di aiuto, in quanto ho postato il file dove da come vedrai e' inserita una procedura per far girare le lancette di un orologio, io sono arrivato fino a questo poi mi sono stancato di continuare, in quanto da adesso in avanti e' solo un lavoro di grafica
    quindi penso che si possa avere uno spunto per effettuare il movimento del pendolo senza incorrere in un blocco di excel.
    altra cosa ora posto un altro file dove il calcolo viene fatto con Timer e in questo caso andiamo addirittura a calcolare i millesimi senza avere un arresto di excel
    infatti in questo momento sto facendo girare il file con una cinquantina di tempi in calcolo simultaneamente senza avere nessun blocco
    puo' prendere spunto anche da quest'altra procedura

    ciao





  • di lepat (utente non iscritto) data: 16/04/2015 12:04:10

    la mia domanda era ironica, gli utenti che hanno bisogno di aiuto sono sempre restii a condividere i loro file e quindi le discussioni si allungano in mancanza di dati certi e senza la possibilità di testare le soluzioni



  • di andrea_feletto data: 16/04/2015 14:57:13

    Scusate se non ho allagato il file, è la prima domanda che faccio e guardando le altre noto che in effetti pochi lo fanno, adesso risolvo. Comunque potreste spiegarmi il funzionamento di DoEvents? Aggiorna le formule e i grafici del foglio?



  • di andrea_feletto data: 16/04/2015 15:15:38

    Grazie a tutti ho risolto. Mancava DoEvents, il resto è ok. Bello l'orologio



  • di oregon (utente non iscritto) data: 17/04/2015 13:53:01

    La DoEvents sospende l'esecuzione del codice e la passa al sistema operativo in modo che questi possa far funzionare la "message pump" ed elaborare i messaggi in attesa. Tra questi, ci sono messaggi WM_PAINT che sono utilizzati per il ridisegno del contenuto delle finestre quando viene modificato. Questi messaggi sono a bassa priorità e se non vengono esplicitamente gestiti non sono elaborati e la grafica sembra "fermarsi".