Comment faire pour que timer n'arrête pas de tourner alors que le programme trav [Résolu]

AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention - 12 oct. 2007 à 15:06 - Dernière réponse : AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention
- 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
Afficher la suite 

13 réponses

Répondre au sujet
boursicotteur 201 Messages postés mercredi 25 septembre 2002Date d'inscription 10 novembre 2007 Dernière intervention - 13 oct. 2007 à 01:44
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de boursicotteur
cs_ws 5 Messages postés jeudi 2 octobre 2003Date d'inscription 21 juillet 2008 Dernière intervention - 12 oct. 2007 à 15:16
0
Utile
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
Commenter la réponse de cs_ws
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 12 oct. 2007 à 16:15
0
Utile
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
Commenter la réponse de cs_casy
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 12 oct. 2007 à 17:53
0
Utile
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)
Commenter la réponse de cs_Jack
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 oct. 2007 à 19:49
0
Utile
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++
Commenter la réponse de BruNews
AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention - 12 oct. 2007 à 20:52
0
Utile
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é....
Commenter la réponse de AngeliusMefyrx
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 12 oct. 2007 à 20:55
0
Utile
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
Commenter la réponse de cs_casy
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 oct. 2007 à 21:18
0
Utile
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++
Commenter la réponse de BruNews
AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention - 13 oct. 2007 à 03:57
0
Utile
Ok, merci
Commenter la réponse de AngeliusMefyrx
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 oct. 2007 à 09:21
0
Utile
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++
Commenter la réponse de BruNews
AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention - 13 oct. 2007 à 13:00
0
Utile
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....
Commenter la réponse de AngeliusMefyrx
boursicotteur 201 Messages postés mercredi 25 septembre 2002Date d'inscription 10 novembre 2007 Dernière intervention - 13 oct. 2007 à 22:48
0
Utile
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...
Commenter la réponse de boursicotteur
AngeliusMefyrx 52 Messages postés lundi 20 mars 2006Date d'inscription 14 octobre 2007 Dernière intervention - 14 oct. 2007 à 00:47
0
Utile
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+
Commenter la réponse de AngeliusMefyrx

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.