Besoin d'un sleep non bloquant [Résolu]

Messages postés
3
Date d'inscription
mardi 2 novembre 2004
Dernière intervention
16 août 2010
- 16 août 2010 à 08:15 - Dernière réponse :
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
16 août 2010 à 08:30
3
Merci
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

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Meilleure réponse
Messages postés
3
Date d'inscription
mardi 2 novembre 2004
Dernière intervention
16 août 2010
16 août 2010 à 08:47
3
Merci
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.

Merci toytoy190 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de toytoy190
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
16 août 2010 à 08:52
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
81
Date d'inscription
vendredi 17 avril 2009
Dernière intervention
12 avril 2013
16 août 2010 à 13:22
0
Merci
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:
Commenter la réponse de cracos30
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
16 août 2010 à 14:19
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
3
Date d'inscription
mardi 2 novembre 2004
Dernière intervention
16 août 2010
16 août 2010 à 23:07
0
Merci
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 ;-)
Commenter la réponse de toytoy190
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
17 août 2010 à 07:57
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.