Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [VB6] Istruzione di ritardo

    nel mio programma per l'invio di dati su seriale ho dovuto usaere dele istruzioni per il ritardo... ho usato questo modo, in un modulo dichiaro

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    poi nel codice
    la richiamo semplicemente così:

    ...
    Sleep (500) ' mezzo secondo
    ...

    il programa funziona ma per tuttto il tempo di esecuzione della procedura in cui inserisco la Sleep il programma si porta sullo stato "Non Risponde"... non esiste un metodo alternatvo alla Sleep?


    Grazie :=)

  2. #2
    codice:
    Public Declare Function GetTickCount Lib "kernel32" () As Long
    
    
    
                    y = GetTickCount
                    
                    Do Until (y + INTERVALLO_CARICO_DATI) < GetTickCount
                        DoEvents
                    Loop
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3
    non ho capito bene come usarla , ne in che unita di misura inserire il ritardo.... millisecondi?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Puoi scrivere

    codice:
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Private Sub Delay(ByVal ms As Long)
        While ms > 0
            Sleep 50
            DoEvents
            ms = ms - 50
        Wend
    End Sub
    se non ti serve una grande precisione ...

  5. #5
    con questo credi si possa risolvere il problema che avevo con la Sleep ossia che il programma andava nello stato "Non Risponde"?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da GraficInside
    con questo credi si possa risolvere il problema che avevo con la Sleep ossia che il programma andava nello stato "Non Risponde"?
    Se te l'ho suggerito ... ... non fai prima a provarlo ?

  7. #7
    non va .... il codice è questo
    ...
    MSComm1.Output = stringaOutput 'invio la richiesta
    Delay (1000) 'attendo
    ricevi = MSComm1.Input 'prelevo la risposta dalla periferica
    If ricevi = "" Then validato = False: GoTo Esci 'se la periferica non risponde esco ed imposto un flag
    ....
    quando eseguo questo codice con la sleep al posto della delay va nello stato non risponde ma la comunicazione avviene correttamente, se metto la delay invece è come se non venisse generato alcun ritardo anche se alzo il numero di millisecondi... la delay l'ho definita esattamente come suggerito da oregon:

    Public Sub Delay(ByVal ms As Long)
    While ms > 0
    Sleep 50
    DoEvents
    ms = ms - 50
    Wend
    End Sub

    PS ho anche provato ad usare la call per richiamare la delay il risultato non cambia

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    156
    Di solito basta inserire dopo la funzione sleep(xxx) l'istruzione doevents
    es:
    For TW = 1 To 10
    Sleep (90)
    DoEvents
    Next TW

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da GraficInside
    non va .... il codice è questo
    ...
    MSComm1.Output = stringaOutput 'invio la richiesta
    Delay (1000) 'attendo
    ricevi = MSComm1.Input 'prelevo la risposta dalla periferica
    If ricevi = "" Then validato = False: GoTo Esci 'se la periferica non risponde esco ed imposto un flag
    ....
    quando eseguo questo codice con la sleep al posto della delay va nello stato non risponde ma la comunicazione avviene correttamente, se metto la delay invece è come se non venisse generato alcun ritardo anche se alzo il numero di millisecondi... la delay l'ho definita esattamente come suggerito da oregon:

    Public Sub Delay(ByVal ms As Long)
    While ms > 0
    Sleep 50
    DoEvents
    ms = ms - 50
    Wend
    End Sub

    PS ho anche provato ad usare la call per richiamare la delay il risultato non cambia
    Il codice della Delay e' corretto ed esegue il ritardo. Puoi controllarlo con

    Print Timer
    Delay (1000)
    Print Timer

    Il problema del diverso comportamento sta da qualche altra parte, del resto non abbiamo visto tutto il codice del programma.

    In particolare, non so se nel tuo programma esiste del codice nell'evento

    OnComm

    del controllo. Questo perche', eseguendo la DoEvents, viene sicuramente eseguito questo evento che potrebbe ricevere i dati eliminandoli dal buffer.

    In realta', il software di comunicazione seriale NON si scrive cosi' come hai fatto tu (e cioe' Invio, Ritardo, Ricezione) ma in modo asincrono. Ovvero, Invio e Gestione della Ricezione dei dati nella OnComm.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da multijet
    Di solito basta inserire dopo la funzione sleep(xxx) l'istruzione doevents
    es:
    For TW = 1 To 10
    Sleep (90)
    DoEvents
    Next TW
    Mi pare che nel codice che avevo suggerito, fosse esattamente cosi' ...

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.