Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di goku370
    Registrato dal
    Oct 2003
    Messaggi
    569

    [VB6] Modalità di esecuzione delle istruzioni

    Avrei una curiosità tecnico/teorica sul VB6... Spero di riuscire a spiegarmi
    Immaginate che ad un certo punto il codice presenti:

    codice:
    Do Until aspetta = False
    DoEvents
    Loop
    Il programma non prosegue con le istruzioni successive finchè la variabile "aspetta" non diviene True... Ma mentre in questo punto l'esecuzione è bloccata, altre parti di codice possono essere in esecuzione ? Mettiamo, se durante questo intervallo scatta un Timer, vengono eseguite le operazione dell'evento Timer ? E se si, dopo che le operazioni del Timer sono concluse l'esecuzione torna al ciclo Do-Until? :berto:
    Una tecnologia sufficientemente avanzata è indistinguibile dalla magia. Terza legge di Clarke

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Sì e no ...

    VB6 non e' multithread e quindi in un determinato momento puo' essere attivo solamente una parte di codice.

    Senza DoEvents, VB non avrebbe modo di accorgersi che e' arrivato il messaggi WM_TIMER che Windows gli invia per indicargli che e' scaduto il timer, e non potrebbe interrompere il ciclo ed eseguire l'evento timer.

    Con il DoEvents, accade invece che tale messaggio viene ricevuto e gestito interrompendo termporaneamente il ciclo, che riprende alla fine della gestione dell'evento timer.

  3. #3
    Tuttavia un metodo del genere di attendere un evento è molto poco ortodosso, poiché consuma un sacco di tempo di CPU inutilmente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Questo e' un altro discorso ... ovviamente manca una Sleep di pochi millisecondi nel ciclo, ma il discorso sulla DoEvents e' indipendente ...

  5. #5
    Certamente, la mia era solo una precisazioncina (caso mai gli saltasse in mente di inserire un ciclo del genere in un suo programma :rollo: ).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di goku370
    Registrato dal
    Oct 2003
    Messaggi
    569
    In effetti mi è saltato in mente di inserire un ciclo del genere in un mio programma...

    Il fatto è che io avevo una serie si Sub che dovevano lavorare su un unico WebBrowser e non volevo che se ne avviasse una mentre un'altra era al lavoro... Cosi ho pensato di inserire quella forma di attesa. Quando una delle operazioni si avviava veniva impstata la variabile attesa = True e alla fine veniva riportata a False, in modo che l'altra funzione iniziasse ad eseguire operazioni solo sel il browser era "libero"...

    ma volevo essere sicuro che fosse fattibile e funzionale...

    Cosa mi consigliereste?
    Una tecnologia sufficientemente avanzata è indistinguibile dalla magia. Terza legge di Clarke

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Cosi' come l'hai detta, non e' facile darti una risposta ... Bisogna capire bene cosa vuoi fare e di quale codice stai parlando ...

  8. #8
    Utente di HTML.it L'avatar di goku370
    Registrato dal
    Oct 2003
    Messaggi
    569
    Il concetto è che la mia applicazione ha due Timer, entrambi con intervallo disposto dall'utente, ed entrambi eseguono istruzioni su di un unico WebBrowser...
    Ora se ad esempio il primo Timer viene impostato con un intervallo di 5 minuti e il secondo di 20 minuti potrebbe capitare che ad un certo punto scattino contemporaneamente... In questo caso dovrebbero essere eseguite le operazioni del primo, mentre il secondo dovrebbe restare in attesa finchè il primo non ha completato...
    Una tecnologia sufficientemente avanzata è indistinguibile dalla magia. Terza legge di Clarke

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    121
    usa variabili booleane che identificano se stai eseguendo già la routine di uno dei 2 timer

    Private Sub tmr1_Timer()


    do
    if tmr2_running=false then exit do
    sleep(50)
    loop

    tmr1_running=true

    '
    'esegui la tua routine

    '


    tmr1_running=false

    End Sub

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.