Sleep VB qui plante

Signaler
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013
-
 hellangel777 -
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

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour,

Que veux-tu "attendre" et pourquoi, exactement (car sleep met en sommeil et rien ne s'exécute pendant sa durée). ?


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Lors de l'envoi de commande par exemple à un Switch, si je vais trop vite ça plante la machine, ou au contraire lors de la reception de ce dernier.
Oui, j'ai besoin d'attendre sans rien rien, et j'aimerai avoir une fonction qui ne fasse pas "planter" le programme.
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010

salut
"Seulement lorsque je fais un Sleep de quelques secondes" = normal sleep bloc toute l'application
montre ton code pour qu'on puisse t'aider
tu peut utiliser "doevents" pour remettre la main au systeme au cas ou tu utilise des boucles
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Par exemple ceci :


Open FileName For Output As #1
    MSComm1.Output = Chr$(26) & vbCr & "show running-config" & vbCr
    For i = 1 To 50
        MSComm1.Output = Chr(32)
    Next
    Sleep (7000)
    Write #1, MSComm1.Input
    Close #1


Je dois attendre que la configuration soit afficher en entière pour la stocker sinon il manque des morceaux
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
il doit bien y avoir un moyen de savoir si MsComm est pret a te donner des données

sinon, je comprend pas l'imbrication fichier / MsComm (ni cette boucle d'espaces) :

MSComm1.Output = Chr$(26) & vbCr & "show running-config" & vbCr & Space$(50)
Sleep (7000)
Open FileName For Output As #1
    Write #1, MSComm1.Input
Close #1


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Cette boucle d'espace permet de tout afficher.
JE m'explique.
Le switch affiche les 10 premières lignes de conf, tant que t'appuie pas sur espace, il attend.
Comme les conf peuvent faire 3 lignes ou 200, j'appuie beaucoup de fois et âpres j'envoie le tout dans le fichier texte.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
que penses tu de l'utilisation de Space$ ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Je ne sais pas ce que c'est lol.

Dans tous les cas ce petit sleep me casse les pieds, si je fais un Doevents, et bien il ne copie rien dans le fichier texte.
Avec le sleep ça fonctionne, mais ça fait planter l'appli pendant tout le temps du sleep.

Existe t-il une autre manière que cela s'attendre sans rien faire d'autre et bien sur sans planter graphiquement l'appli ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
dim nStart as long
nStart = Timer
Do
DoEvents
Loop while Timer < nStart+7


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Merci de ton aide,

Mais non, cela ne fonctionne pas, le fichier texte reste vide.
Du moment qu'il y a DOevents, il fait ça trop vite j'ai l'impression et ça ne fonctionne pas.

Actuellement voila la fonction un peu bidouille que j'ai mais qui fonctionne "en plantant le logiciel pendant un certain temps"


    For i = 0 To 100
        If i 10 Or i 20 Or i = 30 Or i = 40 Or i = 50 Or i = 60 Or i = 70 Or i = 80 Or i = 90 Then
            Write #1, MSComm1.Input
        End If
        MSComm1.Output = Chr(32)
    Next
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Le problème est fort simple, en fait...

tu lit sur le port et tu stocke ce que tu lis dans le fichier

si le périphérique en face n'est pas pret, tu ne lira rien, et pas de deuxieme chance...

lis en boucle, et concatène ce qui est lu jusqu'a ce que tu estime/sache/calcule que ton message est complet et valide.
alors tu pourras quitter ta boucle et ecrire le buffer dans ton fichier


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Je te remercie mais c'est dèjà plus ou moins ce que je fais avec ce "sleep".
Comment faire autrement, as tu un exemple de code ?
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

J'ai testé ça mais cela ne fonctionne pas :

    Do
    DoEvents
    Buffer = Buffer & MSComm1.Input
    MSComm1.Output = Chr(32)
    Loop Until InStr(MSComm1.Input, "end")
    Write #1, Buffer
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Mon fichier texte est vide, car je ne sors jamais de cette boucle.
Pourtant le mot "end" apparait bien dans ce que m'affiche le Switch mais apparemment VB ne le vois pas passer et ne sors jamais de cette boucle, il n'écrit donc pas dans le fichier texte, je ne comprend pas.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
non.

l'ennui est que chaque instrcution MSComm1.Input lit le port, et cette donnée est perdu si tu ne la stocke pas.

ton code est donc pas mal, sauf en ce qui concerne le test de sortie

Loop Until InStr(buffer, "end")



après, j'ai jamais joué avec MsComm, c'est dison du raisonnement de base que je fais là


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Dans tous les cas, en fait cela va trop vite, dans la boucle, et donc mon Buffer est complètement pommé.
La seule solution est de faire une pause réelle durant laquelle le système ne fait rien d'autre qu'attendre sans "Doevents".
Mais voilà pendant 10 secondes la fenêtre devient blanche et plante complètement avec ce sleep.

Cela dit, à la fin du plantage, j'ai mon bon fichier texte....

Mais j'aimerai vraiment faire autrement.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
DoEvents, c'est assez simple en fait, comme instruction.

ca va forcer VB à consommer tous les messages lui étant déstinés.
du coup, Windows ne considérera pas ton application comme non-réactive, et ton interface réagira égallement.

du coup, ca chopera les messages concernant MsComm et remplira ton Buffer Input.

Maintenant, je vois pas en quoi cela deviens problématique, dés lors que tu lis bien (une seule fois) le contenu récéptionné dans Input et que stockes bien le tout de coté...


au pire, tentes de petites pause répétées :

Dim sBuffer as String
Do
    Sleep 200
    DoEvents
    sBuffer = sBuffer & MSComm1.Input
    MSComm1.Output = Chr(32)  '# J'ignore pourquoi cette ligne est là. Ne faut il pas envoyer également un Chr$(13) ?
Loop Until InStr(sBuffer, "end")
Open "...." For Ouput As #1
    Print #1, sBuffer;
Close #1



Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Alors, cette ligne :

MSComm1.Output = Chr(32)

Envoi des espaces. Parce que lorsque je demande au Switch de me montre sa configuration, il me montre une partie et attend que j'appuie sur l'espace. Donc comme je connais pas la longueur de la config (variable) j'arrive pas à savoir combien de fois je dois appuyer.

Bref, lol, il ne sort jamais de la boucle en fait là. Pourtant dans la config, le dernier mot à chaque fois c'est bien "end".

Je ne comprend pas
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
testé en pas a pas ?

et c'est bien "end" pas "END" ou "End" ?

quid de l'envoi de chr(32) et chr(13) c'est tout faux ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
191
Date d'inscription
jeudi 7 janvier 2010
Statut
Membre
Dernière intervention
15 mai 2013

Il s'agit bien de "end" comme ceci.
Testé en pas en pas, c'est à dire ?
Et quid ca veut dire quoi lol ?
1 2