Sleep VB qui plante

Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 - 15 déc. 2009 à 17:07
hellangel777 Messages postés 267 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 novembre 2013 - 18 déc. 2009 à 09:16
Bonjour a tous,


J'utilise la fonction Sleep suivante sous VB :

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


Seulement lorsque je fais un Sleep de quelques secondes, mon appli plante plus ou moins, et reviens à la fin du sleep.

N'y a t-il pas une autre manière d'attendre sans plantage ou ralentissement ?

Merci

25 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 déc. 2009 à 20:56
pas a pas, c'est en executant le code ligne apres ligne, en placant un point d'arret (F9)
et en pressant F8 pour executer la ligne selectionnée

quid...

ben, me semblais que tout envoi MsComm devait etre validé par un chr(13)


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 1
18 déc. 2009 à 08:09
On y est presque, avec cette fonction :

    Do
        DoEvents
        Sleep (300)
        buffer = buffer & MSComm1.Input
        MSComm1.Output = Chr(32)
    Loop Until InStr(buffer, "!" & vbCrLf & "end")


Voilà je sors bien de ma boucle, pas de figeage d'écran, mais encore un soucis...
Il manque des morceaux de mots... Ils s'affichent sur mon écran, et ne sont donc pas dans mon txt. Par exemple, dans ma fenetre je vois :

assword-e


Et dans mon fichier texte j'ai sur cette ligne :

service pncryption


Comme tu t'en doute la ligne correcte qu'il me faut c'est :

service password-encryption


Seulement sur mon fichier texte de 150 lignes, il me manque seulement deux ou trois petits morceaux de mot. C'est pas grand chose mais ça flingue le txt. J'ai essayé de faire varier le sleep, mais sans succès, on est vraiment pas loin mais y'a toujours un petit truc qui fait ****


:)
0
hellangel777 Messages postés 267 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 novembre 2013 1
18 déc. 2009 à 08:21
Bonjour,

Je m'excuse si je suis hors des clous, j'ai fait de la lecture en Z de ce topic, pourtant ton problème, j'ai eu le même sous vb6.
Le truc c'est que j'ai utilisé une fonction automate combinée avec un timer. C'est à dire que je lancais ma communication et je stocquais les données reçues dans un buffer et je ne lançais aucunes autres instructions tant que me timer n'était pas échu.
As-tu tenté l'option timer plutot que le sleep?


HellAngel777
Les machines ne font pas d'erreurs
Heureusement nous sommes humains
0
Lokomass Messages postés 191 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 15 mai 2013 1
18 déc. 2009 à 08:28
Non je n'ai pas testé, je en sais pas comment faire.
Merci de ta réponse, aurais tu un exemple de timer à inserer dans mon code et comment le mettre ??


MErci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hellangel777 Messages postés 267 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 26 novembre 2013 1
18 déc. 2009 à 09:16
Je te file ca brut... Ca remonte à longtemps...
Je précise que c'est du vb6 !!!

Private Sub Automate(Situation As String)
Dim i As Integer
    
    i = 0
    Select Case Situation
        Case "TimeOut"                '-- Gestion du TimeOut
            '-- On vérifie que l'on a pas reçu d'information
            If rsResultat.RecordCount > 0 Then
                '-- On a des informations on lance la commande de traitement
                Automate ("TraitementFinal")
            Else
                '-- On a pas d'information et on défini une variable en mode erreur
                TypeErreur = "TimeOut"
                frm_Principale.timerCommande.Interval = 500
                frm_Principale.timerCommande.Enabled = True
                EnvoiCmd = False
            End If
        Case "ErreurReception"        '-- Erreur dans la réception
            TypeErreur = "ErrRcpt"
            TimerTimeOut.Enabled = True
            EnvoiCmd = False
        Case "TraitementInter"
            DoEvents
            Do While InStr(strBuffer, Chr$(13))
                strbuffer2 = Left(strBuffer, InStr(strBuffer, Chr$(13)))
                If frm_Principale.ValidEntree = True And InStr(strbuffer2, "[GES]") > 0 Then
                    strbuffer2 = Left(strbuffer2, Len(strbuffer2) - 1)
                    strbuffer2 = Right(strbuffer2, Len(strbuffer2) - 1)
                    rsResultat.AddNew
                    rsResultat!Ligne.Value = strbuffer2
                    rsResultat.Update
                    strBuffer = Right(strBuffer, Len(strBuffer) - InStr(strBuffer, Chr$(13)))
                Else
                    rsResultat.AddNew
                    rsResultat!Ligne.Value = strbuffer2
                    rsResultat.Update
                    strBuffer = Right(strBuffer, Len(strBuffer) - InStr(strBuffer, Chr$(13)))
                End If
            Loop
            TimerTimeOut.Enabled = True
            TypeErreur = "TrtmtInter"
        Case "TraitementFinal"
            If frm_Principale.ValidEntree = True And InStr(strBuffer, "[GES]") > 0 Then
               strbuffer2 = Left(strbuffer2, Len(strbuffer2) - 1)
               strbuffer2 = Right(strbuffer2, Len(strbuffer2) - 1)
               rsResultat.AddNew
               rsResultat!Ligne.Value = strbuffer2
               rsResultat.Update
               strBuffer = Right(strBuffer, Len(strBuffer) - InStr(strBuffer, Chr$(13)))
            Else
                rsResultat.AddNew
                rsResultat!Ligne.Value = strBuffer
                rsResultat.Update
                rsResultat.MoveFirst
            End If
            TypeErreur = "BufferFinal"
            frm_Principale.timerCommande.Interval = 500
            frm_Principale.timerCommande.Enabled = True
            TimerTimeOut.Enabled = False
            EnvoiCmd = False
        Case "PBConnexion"            '-- Erreur dans la connexion au module
            TypeErreur = "ErrCnx"
            TimerTimeOut.Enabled = True
            EnvoiCmd = False
    End Select
End Sub

Private Sub Communique_OnComm()
Dim strRecep As String

    Select Case Communique.CommEvent

        'liste des erreurs possibles

        Case comEventBreak      ' On a reçu un signal d'interruption (Break)
            Call Automate("ErreurReception")
        Case comEventCDTO       ' Timeout de la porteuse
            Call Automate("ErreurReception")
        Case comEventCTSTO      ' Timeout du signal CTS (Clear To Send)
            Call Automate("ErreurReception")
        Case comEventDSRTO      ' Timeout du signal de réception
            Call Automate("ErreurReception")
        Case comEventFrame      ' Erreur de trame
            Call Automate("ErreurReception")
        Case comEventOverrun   ' Des données ont été perdues
            Call Automate("ErreurReception")
        Case comEventRxOver     ' Tampon de réception saturé
            Call Automate("ErreurReception")
        Case comEventRxParity   ' Erreur de parité
            Call Automate("ErreurReception")
        Case comEventTxFull     ' Tampon d'envoi saturé
            Call Automate("ErreurReception")
        Case comEventDCB        ' Erreur de réception DCB (jamais vu)
            Call Automate("ErreurReception")
        
        ' liste des événements possibles qui sont, eux, normaux
        Case comEvCD            ' Changement dans la broche CD (porteuse)
        Case comEvCTS           ' Changement dans broche CTS
        Case comEvDSR           ' Changement dans broche DSR (réception)
        Case comEvRing          ' Changement dans broche RING (sonnerie)
        Case comEvReceive       ' Si on reçoit des données
            If EnvoiCmd True Or frm_Principale.ValidEntree True Then
                If frm_Principale.ValidBETGVA = True Then
                    TimerEOF.Interval = 5000
                Else
                    TimerEOF.Interval = 500
                End If
                TimerEOF.Enabled = True
                strBuffer = strBuffer & Communique.Input
                If InStr(strBuffer, Chr$(13)) > 0 Then
                    TimerEOF.Enabled = False
                    Call Automate("TraitementInter")
                End If
            End If
        Case comEvSend          ' Il y a des caractères à envoyer
        Case comEvEOF           ' On a reçu le caractère EOF
    End Select
End Sub


C'est une partie du code que j'ai fait qui est en fait un mscomm associé à un timer Le tout mis dans un controle utilisateur.

HellAngel777
Les machines ne font pas d'erreurs
Heureusement nous sommes humains
0
Rejoignez-nous