Comment faire pour que timer n'arrête pas de tourner alors que le programme trav

Résolu
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007 - 12 oct. 2007 à 15:06
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007 - 14 oct. 2007 à 00:47
Bonjour

En fait dans le sujet, ca dit tout.

Donc, comment dois-je faire pour que timer n'arrête pas de tourner alors que le programme execute certaines tâche....

En fait j'ai un programme qui fait un

Timer_IE.Interval = 30000
Timer_IE.Enabled = True

While IE.busy
    DoEvents
Wend

Et je veux insérer du code dans le DoEvents qui dit que si finalement le timer tombe à 0, hey bien fait tel ou tel truc.... sauf que puisqu'il est en train de travailler, le timer bouge pas...
Je veux pas décrémenter moi même le timer puisque je ne sais même pas combien de temps dure un DoEvents...

Merci
A voir également:

13 réponses

boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
13 oct. 2007 à 01:44
Tu confonds les choses Angélius...

Doevents est une instruction à insérer dans une boucle et dont la fonction est d'exécuter les événements en attente.

Ex: Tu as une boucle de disons 100 millions de cycles pour qu'elle dure très longtemps.
Pendant tout ce temps, le processeur est occupé exclusivement à ta voucle et il ne peut pas gérer les événements qui peuvent intervenir. Par exemple un bouton sur lequel tu appuis (événement click), un timer qui arrive à son terme, etc.

Si tu places l,instruction doevents dans la boucle, le processeur VA TRAITER les événements en attente CHAQUE FOIS qu'il va rencontrer cette instruction. Une fois ces événements traités (ça prends le temps qu'il faut) , le processeur continue sa boucle.

Si tu veux un chronomètre qui sera précis MALGRÉ ces interruptions, il faut utiliser l'api GETTICKCOUNT. Cet api te donne le temps processeur à un moment précis avec une précision du milisec. Le temps écoulé entre 2 échantillons de temps faits par gettickcount est obtenu par une simple soustraction. Suffit donc de se faire une petite sub contenant l'appel gettickcount, de faire des soustraction et d'afficher ton résultat...et voila ton chronomètre qui va être précis même si il n'est pas updaté à des intervals précis. Ton appel pour cette sub est placé à un ou même plusieurs endroits stratégiques dans ton prog ou dans des boucles.

Voila! Tout a été dit...
3
cs_ws Messages postés 5 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2008
12 oct. 2007 à 15:16
Je peux me tromper mais un timer ne s'arrête pas si tu ne l'arrête pas ou alors je n'ai pas bien compris ta question

Will
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 oct. 2007 à 16:15
un controle Timer possède un évènement Elapsed. Cet évènement est automatiquement déclenché toutes les x millisecondes, x étant la valeur que tu as mis dans la propriété Interval.

C'est dans le code de cet évènement qu'il faut mettre le code à executer régulièrement.

Quant au DoEvents, sa durée est très variable, dépend de l'appli, du système, mais aussi de ce que le système fera comme opération durant ce DoEvents.
DoEvents n'est pas réellement une instruction, c'est juste un message que ton code envoie au système pour lui dire, "moi je fais une toute petite pause, si tu as quelque chose à faire, profite-en, je te donne un peu de mon temps".

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 oct. 2007 à 17:53
Salut
Un Timer n'est pas un chronomètre, c'est un composant qui va déclencher un évènement toutes les .Interval millisecondes (pour toi, toutes les 30 secondes).
Un timer n'est pas fiable car l'évènement ne se produit que si la machine a le temps.
Donc, si ton programme a une grosse charge de travail, il se peut que le timer ne se déclenche pas préciséemment toutes les 30 secondes.
Si tu veux décrémenter une valeur à chaque cycle de ton timer, il faut utiliser une variable déclarée au niveau "Déclaration" de la forme qui l'accueille :
Dans "Déclaration" :
   Private monCompteur As Long
Valeur initiale de ton chrono (dans Form_Load par exemple) :
   monCompteur = 10
Dans ta sub nommée Timer_IE_Timer :
   If monCompteur <= 0 Then
      ' Compteur terminé
      ' Ici, tu fais ce que tu veux
   Else
      ' Sinon, compteur pas fini : on le décrémente
      monCompteur = monCompteur - 1
   End If

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 oct. 2007 à 19:49
Petite rectif:
DoEvents n'est pas un message system, c'est unr instruction VB au même titre que Trim() ou nimporte quelle autre. Avec cette instruction, VB fait un appel PeekMessage et si message il y a sur la pile d'appels, alors il est traité puis le code reprend là où il en était. C'est bien entendu tout à fait contre productif mais VB ne connaissant pas les threads, pas moyen de faire autrement.

ciao...
BruNews, MVP VC++
0
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007
12 oct. 2007 à 20:52
Alors ma question serait....

Comment je fais pour avoir un chrono si un timer fait pas l'affaire?

En fait, je veux gérer des évènements non relié....
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 oct. 2007 à 20:55
Je n'ai pas dit que DoEvents était un message système, j'ai dit que c'était "...juste un message que ton code envoie au système pour lui dire, "moi je
fais une toute petite pause, si tu as quelque chose à faire,
profite-en, je te donne un peu de mon temps"...."
C'est juste une façon imagée de dire les choses, mais peut-etre auraisje dû dire "mot doux" à la place de "message"

Bien sur que DoEvents est une instruction VB, mais ce n'est pas une instruction qui (comme la plusplart des intructions) va faire un calcul ou autre, c'est une instruction qui dit (là encore c'est imagé ), je ne fait rien je te laisse faire ce que tu as à faire.

Mais bon même les plus grands auteurs ont un jours été mal compris. Mais vous verez, un jours je serais célèbre
(pas trop célèbre quand même, on est bien tranquille dans l'anonymat en réalité)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 oct. 2007 à 21:18
Le timer est vraiment mystifié sur vbfrance.

"...l'évènement ne se produit que si la machine a le temps"
Niet, le kernel est préemptif sur toute autre tache, l'event WM_TIMER sera bien posté (à qlqs ms près). Reste ensuite à savoir si le prog sera en mesure de le traiter.
Il est à noter que chaque message a un niveau de priorité, WM_TIMER est avec WM_PAINT celui de plus basse priorité, la pile d'appels n'est pas une unité linéaire comme la queue chez le commerçant, un msg est placé devant un autre de plus basse priorité même s'il est arrivé en dernier. A noter aussi que le systeme ne placera jamais 2 msg WM_TIMER sur la pile, le flag QS_TIMER devra avoir subi un reset avant que le systeme n'empile le prochain WM_TIMER.

ciao...
BruNews, MVP VC++
0
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007
13 oct. 2007 à 03:57
Ok, merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2007 à 09:21
Un processeur ne gère aucun événement, ce n'est pas son role, c'est une unité de calculs.
C'est le système (l'OS) via ses drivers qui les gère.
Un CPU exécute ce que le système lui donne à exécuter, c'est toujours l'OS qui décide quel thread de quel processus est traité, il peut l'interrompre et le relancer quand il veut. Le CPU n'a aucune décision là dessus.
GetTickCount() n'a pas de précision à la milliseconde, ce n'est qu'une approximation qu'on peut connaitre par GetSystemTimeAdjustment. La seule fonction donnant une haute précision depuis l'user mode est QueryPerformanceCounter.

ciao...
BruNews, MVP VC++
0
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007
13 oct. 2007 à 13:00
En fait, pour ce qui est du DoEvents, je peux le controuner...toutefois si je fais afficher un msgbox, tant que l'utilisateur n'a pas répondus ou fais ok, tout mes timer son en attente et font rien......

J'imagine qu'une contournement serait de créer moi même ma forme chkbox....avec un timer qui disparait au bout d'une minute ....comme ca le programme continu a tourner....
0
boursicotteur Messages postés 201 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 10 novembre 2007
13 oct. 2007 à 22:48
Oui c'est vrai qu'un msgbox bloque tout et je trouve ça pas brillant du tout.

Je contourne ce problème en utilisant des contrôles (entrée ou sortie) sur le formulaire. Par exemple, tu affiches le temps de ton chrono dans un txtBox ou un label situé sur ton formulaire. Quand tu n'en a plus besoin, tu le rends invisible.
 
Si tes besoins sont plus grands, tu peux aussi afficher un petit formulaire et quand terminé, tu t'en débarrasse avec un timer ou mieux, avec l'événement click d'un bouton (si tu dois entrer des données).

Quelle journée monotone!
Est-ce qu'il pleut chez toi? Montréal?

Ici en mauricie c'est la m**** mais il y a quand-même plein de touristes français pour faire des tours d'hydravion tout près d'ici. La forêt est belle mais faudrait me payer cher pour y aller quand il pleut...
0
AngeliusMefyrx Messages postés 52 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 14 octobre 2007
14 oct. 2007 à 00:47
Haha ok merci
Au pire je ferai un form pour mes message box..., mais bon, c'est pas une obligation...c'étais juste un timer qui roule au 5-10minutes qui chk si dans la base de données ya une donnée boolean qui dit de barrer le programme..et si oui ca ferme le programme....comme ca le monde qui laisse le .exe ouvert toute les soirées ouvert, ca me bloque pas pour faire un update sur le réseau....lol

Oui il pleut, moralement c'est toujours un petit plus pour se dire que ca dérange pas trop jouer à l'ordi.... lol

A+
0
Rejoignez-nous