Besoin d'un sleep non bloquant

Résolu
toytoy190 Messages postés 3 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 16 août 2010 - 16 août 2010 à 08:15
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 17 août 2010 à 07:57
Bonjour,

Je suis en train de créer un programme qui envoi des commandes sur le port com par l'intermediare d'une boucle while, jusque la pas de probleme.

Je voudrais pouvoir controler le lancement et l'arret, pour cela j'ai crée 2 commandbox Start et Stop.

Le problème est que je ne peut pas stopper la boucle car le sleep me bloque mon form...

Avez vous une solution a ce problème ?

Mon code :

Public Sub CommandSTART_Click()
arret = False
i = 1
Do While i < 10000
'
moteurCOM
'
If arret = True Then
Exit Do
End If
i = i + 1
DoEvents
Loop


Public Sub moteurCOM()
    If Not com.PortOpen Then 'Ouvre le port s'il n'est pas encore ouvert
        com.PortOpen = True
        If Err Then Exit Sub
    End If

    com.Output = "en" 'commande a envoyer
    Sleep 30000 'Pause 
    com.PortOpen = False 
End Sub


Public Sub CommandSTOP_Click()    
    'Ferme le port s'il est ouvert
    arret = True
    If Tel.PortOpen Then
        Tel.PortOpen = False
    End If
    '
    reinit
    CommandSTART.Enabled = True
    CommandSTOP.Enabled = False
    
cancel:
End Sub

7 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 août 2010 à 08:30
Salut,

Au lieu de faire un gros sleep qui te bloque l'exécution pendant 30 secondes, fais-en plusieurs plus petits, par exemple :

For i = 0 to 30
Sleep 1000 'pause d'une seconde
If arret Then 'prévoit un échappatoire pour quitter la boucle si nécessaire
Exit Do
End If
next i
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
toytoy190 Messages postés 3 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 16 août 2010
16 août 2010 à 08:47
Merci dark pour l'astuce, apres avoir mis :
For i = 0 To 30
Sleep 1000 'pause d'une seconde
If arret = True Then 'prévoit un échappatoire pour quitter la boucle si nécessaire
Exit For
End If
DoEvents
Next i


a la place de mon sleep ça fonctionne impec ;-)

PS : ça ne fonctionne pas sans le DoEvents.
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 août 2010 à 08:52
Salut,

Oui en effet, un doevents permet à ton interface de se raffraichir toutes les secondes, ce qui n'est pas un luxe.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cracos30 Messages postés 81 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 12 avril 2013
16 août 2010 à 13:22
Salut
J'utilise ça pour les temps d'attente long:

Ct = DateAdd("s", 10, Now)
Do While Ct > Now
'Ce qu'il faut faire....si c'est Ok then goto phas1

Loop
MsgBox "Erreur sur la phase1"
phas1:
0

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

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 août 2010 à 14:19
Salut,

Crasos30 : c'est ce qu'on appelle une attente active, qui prend 100% du CPU pour rien. Bref, c'est la façon bourrin qu'il faut éviter à tout prix.

Quand à l'utilisation du goto... c'est un truc à bannir depuis belle lurette pour ce genre de chose.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
toytoy190 Messages postés 3 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 16 août 2010
16 août 2010 à 23:07
Merci Crasos30 pour ta contribution mais en effet, prendre 100% du CPU juste pour faire une pause dans un prog qui envoi de simple commande COM, ce n'est pas ce que je cherchai. Surtout dans une boucle ou l'operation peut etre renouvelé plus de 1000 fois... conso CPU inutile, et surchauffe a la longue.

je vais surement porté mon appli en .net, la au moins il y a les threads...

merci a vous 2 ;-)
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 août 2010 à 07:57
Salut,

Tu peux très bien utiliser les threads en vb6 : il faut passer pas les API windows, c'est un peu instable en mode IDE si tu t'y prends mal, mais c'est tout à fait réalisable.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Rejoignez-nous