[VB6] Problème Timer dans boucle For-Nest

Résolu
STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005 - 30 nov. 2005 à 09:16
STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005 - 2 déc. 2005 à 07:43
Bonjour,
Je me présente, Stéphane BEHMENBURG, 38 ans, marié, 3 enfants, je suis astronome amateur au sein de la Société d'Astronomie de METZ - MESSIER 57.
Pour l'astronomie, je suis amené à m'intérresser de près où de loin à d'autres activités telles que l'électronique, les mathématiques, la physique ... et pour facilité tout çà à l'informatique ... sur mon lieu de travail on avait 1 licence VB6 depuis 1999 ... qui n'avait jamais servi ... mais depuis 1 mois m'y suis mis en achetant des livres de chez Micro... tions.
Dernièrement j'ai réalisé un accessoire (Une roue à filtres motorisée) qui est pilotée par le port série du PC ... j'ai trouver sur ce site les renseignements nécessaires pour le comtrôle du port série .... mais voilà que je bute depuis 1 semaine sur un problème plus que basique à mon sens.
Je vous transcrit une partie du code ... se sera plus facile :

----------------------------------------------
PrivateSub ...
...
For N = 1 To 3 'où 3 est un exemple
Instruction 1 ...
Instruction 2 ...
... Timer1.Enabled True 'J'enclenche le Timer1 où Value 3000 ms
Next N
...
--------------------------------------------------
PrivatSub Timer1.timer()
...
Instruction a ...
Instruction b ...
...
Timer1.Enabled = False 'J'arrete le Timer1 à la fin des 3000 ms
End Sub
--------------------------------------------------

En fait je souhaiterais que dans la boucle For-Next, après les instructions 1, 2 et le déclenchement du Timer1 ... on attende que Timer1.Enabled = False avant de recommencer la boucle ... j'ai été assez clair là ,o)))

En effet ma boucle For-Next s'éxécute bien 3 fois, mais pas avec un intervale de 3000 ms.

Et là je n'ai pas trouvé de solution, je pense que ce doit être simple, mais VB6 pour moi = 1 mois seulement.

Voili voilou,
j'espère que vous allez pouvoir m'aider.

Stéphane BEHMENBURG

11 réponses

STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
2 déc. 2005 à 07:43
Ayé çà marche

J'ai retenu la solution qui utilise la fonction GetTickCount de la dll kernel32 en remplacant &lt; par <. Mon proc monte à 100% la temps de la pause ... environ 3 secondes ... mais cela ne me dérange pas plus que çà.

Sinon Sleep de la dll kernel32 fonctionne aussi parfaitement, juste que sa fige l'application lors de son exécution, mais par contre moins précis que GetTickCount, car il a fallu que je modifie mais intervalles de pause théoriques.

Voili voilou ...
Encore merci à vous tous.

Mais ne partez pas tout de suite ...
J'ouvre un autre Topic pour le changement d'une image affichée dans un contrôle image lors de l'exécution d'un programme.

@+
Stéphane
3
cs_vpoyo Messages postés 363 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 20 avril 2010 6
30 nov. 2005 à 09:45
Salut,

haaaa enfin quelqu'un qui dit bonjour, se présente, un titre explicite et indiquant le langage.
pour la peine 10/10 :)
ca se fait rare les gens comme ca :(

pour ton problème, il faudrait utiliser un booléen comme flag (drapeau).

en effet ton timer (avec instruction a, instruction b) va être déclencher par évènement dans un "processus" à part.
ce qui a pour effet que c'est non bloquant et n'empêchera pas ta boucle for de continuer.

si tu rajoute en global un booléen EndTimer


dans PrivatSub Timer1.timer() à la fin du traitement tu le passes à True
et dans ton for tu fais ainsi

for N=1 to 3
EndTimer = False

'mes instruction
' ...

Timer1.Enabled = True

'attendre fin du timer
while (not EndTimer)
DoEvents() 'Permet de pas geler l'application
wend

next

ceci devrait résoudre ton PB. Une autre méthode serait de piloter ton traitement par évènement
0
STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
30 nov. 2005 à 09:51
Merci vpoyo pour le 10/10 en présentation , j'espère bientôt une telle note en application

Je m'en vais essayer ta solution ce soir en j'en rendrais compte après.

@+

Stéphane
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
30 nov. 2005 à 10:42
salut,


juste un precision, si le but du timer et de faire une pause, il y a aussi des sources sur ce site pour faire une pause d'une durée précise sans timer.


certaines sont tres basiques mais ne rendent pas la main au programme, d'autres fonctionnent très bien.

ca sera peut etre plus simple.
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 nov. 2005 à 12:34
salut STEFBEHM,

ton idée de timer n'est pas mauvaise mais çà ne se passe pas comme çà.

VB lit ligne par ligne. il va donc lancer ton timer puis directement lire sa ligne suivante, à savoir "Next N "



il faut donc soit bloquer dans ta boucle, soit figer l'appli.



voici 2 méthodes. la première (DoEvents) prend pas mal de ressources
sur une durée définie, mais te laisse accès à la Form, la seconde fige
l'appli, par API.






Private Sub TaPrecedure()

Dim i As Long 'déclaration pour première méthode

'...

For N = 1 To 3 'où 3 est un exemple

Instruction 1 '...

Instruction 2 '...

'...



' -------------------------

' première méthode de pause

' -------------------------

For i = 0 To 3000000 'valeur à modifier en fonction de la pause voulue

DoEvents 'rend la main au système pour ne pas planter l'appli

Next i





' !!!!!!!!!!!!!!!!!!

' !!!!! OUBIEN !!!!!

' !!!!!!!!!!!!!!!!!!



' -------------------------

' deuxième méthode de pause

' -------------------------

Call Sleep(3000) 'temps exprimé en millisecondes





' puis enfin les instruction après la pause ;)

'...

Instruction a '...

Instruction b '...

'...



Next N

'...

End Sub





<small> Coloration
syntaxique automatique [AFCK]</small>













++

PCPT [AFCK]
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 nov. 2005 à 12:40
woups... à précéder de ceci :










Option Explicit 'oblige la déclaration des variables

'

' API Sleep, pour la deuxième méthode

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





<small> Coloration
syntaxique automatique [AFCK]</small>
0
STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
1 déc. 2005 à 08:28
Bonjour tout le monde,
comme promis j'ai bosser vos solutions hier soir, et ma foi j'ai encore quelques soucis
Cela confirme que mon niveau en Visual Basic est au raz des paquerettes ... mais je m'accroche

-----------------------------------------------------------------------------------------------------------

1) En utilisant Sleep de la DLL kernel32, cela fonctionne ... mais comme prévu çà fige mon application

-----------------------------------------------------------------------------------------------------------

2) A l'attention de vpoyo

Dans ta solution tu dis "si tu rajoute en global un booléen EndTimer" ... là j'ai pas compris, tu peux m'expliquer ... Je pense que pour beaucoup de personnes ta phrase aurait suffit mais pour un grand novice comme moi ...
Ensuite tu dis "dans PrivatSub Timer1.timer() à la fin du traitement tu le passes à True" ... ce ne serait False pour arrêter le timer ?

-----------------------------------------------------------------------------------------------------------

3) A l'attention de pcpt

dans ta 1ère solution ... que je n'ai pas réussi à appliquer ... "For i = 0 To 3000000 'valeur à modifier en fonction de la pause voulue "
3000000 c'est le nombre totale de boucles ? ... équivalent à un temps en millisecondes ???

-----------------------------------------------------------------------------------------------------------

4) Sinon dans les archives j'ai trouvé cette solution

Salut...
Voici quelques remarques :


1) L'API sleep n'est pas une réelle pose puisque qu'elle bloque l'execution du programme.


2) Pour faire une pose tu peux faire plus simplement.. Regarde .. Et pas besoin de module ....


tu declares en générale cet API :

Private Declare Function GetTickCount Lib "kernel32" () As Long

Et ensuite tu mets cette procedure dans ton form :
Public Sub Attente(ByVal MilsecToWait As Long)
Dim lngEndingTime As Long
lngEndingTime = GetTickCount() + (MilsecToWait)
Do While GetTickCount() &lt; lngEndingTime
DoEvents
Loop
End Sub

Puis pour mettre une pose, tu n'as cas appeller la procédure comme suit :
Attente 2000 ' le temps est en milliseconde..

Alors j'ai testé mais le ; de &lt; me provoque une erreur de compilation Attendu : fin d'instruction et là encore une fois je n'ai pas trouvé de solution.

-----------------------------------------------------------------------------------------------------------

5) Il y a encore les solution là ... dont je n'est pas bien compris le sens

Sinon un autre solution plus simple serait d'utiliser un timer comme ceci


public sub myTimer_proc()
mytimer.enable = false
end sub


et dans le code
myTimer.enable = true
while myTimer.enable
dovents
wend


Je m'en sert pour mes timeouts de connexion avec winsock. a+

OU ENCORE PLUS SIMPLE KI DISENT

Public Sub Pause(ByVal Duree As Single, Optional ByVal bloque As Boolean = False)
Dim Debut, courant As Single
Debut = Timer
Do
If Not bloque Then DoEvents
courant = Timer
If courant < Debut Then courant = courant + 24 * 3600
Loop While (Debut + Duree) > courant
End Sub

Mais là je décroche

Voili voilou pour mes investigations
En espérant ne pas trops vous em....er avec mes problèmes

@+
Stéphane
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 08:55
salut,


1) bah ouai, c'est le principe de Sleep





2) Vpoyo ne parlait pas du tiler mais de la variable EndTimer. il n'y a
donc aucun intérêt!!! sa proposition est lamême que la première partie
de ton "5)" en laissant néanmoins le code dans le sub Timer(). pas
propre.... (désolé^^)





3) 300000 (à modifier) est ton nombre de passage en boucle, ce qui ne
correspond absolument pas à un temps précis, puisque variable en
fonction de la rapidité du PC. là où tu peux avoir du mal à mettre mon
code en application, c'est sans doute parce que mon code est pour VB6
et non VBA que tu sembles utiliser.....


le principe est le même, sauf certaines syntaxes que je ne connais pas
spécifiquement (çà doit sans doute être uniquement au niveau des
déclarations)





4).2) ce n'est qu'un problème de navigateur, et donc d'affichage du signe "<"





5).1) ....évoqué plus haut





5).2) même principe, mais avec "timer" = commande VB qui renvoie le temps écoulé depuis minuit et qui se remet à 0 à minuit





espérant que tu y vois un peu plus clair





++


PCPT [AFCK]
0
cs_vpoyo Messages postés 363 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 20 avril 2010 6
1 déc. 2005 à 09:03
bah tout est dit
0
STEFBEHM Messages postés 7 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
1 déc. 2005 à 09:18
Merci à vous 2

J'utilise VB6 Initiation et VB5 Pro ...

Donc ce soir je m'y remet et je remplace &lt; par <

Je vais y arriver que j'vous dit
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
1 déc. 2005 à 10:54
salut

pour repondre juste a ton 1)
la fonction sleep bloque ton appli, mais tu peux faire une boucle avec un DoEvents
par exemple si tu veux faire une pause de 3000 ms, tu faire


for i = 1 to 30
sleep(100)
DoEvents
next i

comme ca ca fait 30 pause de 100 ms et tu t'y retrouve tout en gardant la main sur ton programme.

mais attention, tu n'aura pas exactement 30000 ms, car il y a des execution qui prennent du temps, comme le doevents.
apres ca depend de la precision dont tu as besoin dans tes 3000 ms...

si tu veux plu de precision, regarde cette source par exemple :
http://www.vbfrance.com/code.aspx?id=30903

la ton proc risque de monter a 100% le temps de la pause, mais reste a voir si ca te gene vraiment, en fonction de ce que tu fait avec ton programme.
0
Rejoignez-nous