Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UNE PETITE PAUSE, EN MICROSECONDE.


Information sur la source

Catégorie :Système Classé sous : pause, microseconde Niveau : Débutant Date de création : 22/04/2005 Date de mise à jour : 22/04/2005 00:06:47 Vu : 7 240

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

C'est rare mais des fois on ne veut pas que ça aille trop vite !

bonne pause !

ryl...
 

Source

  • Exemples d'utilisation:
  • DelayUS (1) = 1 µS
  • DelayUS (100) = 100 µS
  • DelayUS (100000) = 100 mS
  • DelayUS (1000000) = 1 S
  • ------------------------------------------
  • Option Explicit
  • Private Declare Function QueryPerformanceCounter Lib "kernel32" _
  • (X As Currency) As Boolean
  • Private Declare Function QueryPerformanceFrequency Lib "kernel32" _
  • (X As Currency) As Boolean
  • '//////////////////////////
  • '// Attendre N microSeconde
  • Private Sub DelayUS(MicroS)
  • Dim Frq_Base As Currency, Time_memo As Currency, Time_now As Currency
  • Dim dif As Long
  • If QueryPerformanceFrequency(Frq_Base) Then ' Base fréquence systême
  • QueryPerformanceCounter Time_memo ' Repère temps
  • Do
  • QueryPerformanceCounter Time_now ' Comparer le Repère temps au temps qui
  • dif = (Time_now - Time_memo) * 1000000 / Frq_Base ' s'écoule
  • Loop Until dif > MicroS ' Si pause pas suffisante recommencer
  • End If
  • End Sub
Exemples d'utilisation:

DelayUS (1)			= 1 µS
DelayUS (100)			= 100 µS
DelayUS (100000)		= 100 mS
DelayUS (1000000)		= 1 S

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

Option Explicit

Private Declare Function QueryPerformanceCounter Lib "kernel32" _
                                 (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "kernel32" _
                                 (X As Currency) As Boolean
                                 
                                 

'//////////////////////////
'// Attendre N microSeconde
Private Sub DelayUS(MicroS)
  Dim Frq_Base As Currency, Time_memo As Currency, Time_now As Currency
  Dim dif As Long
       
  If QueryPerformanceFrequency(Frq_Base) Then ' Base fréquence systême
    QueryPerformanceCounter Time_memo       ' Repère temps
    Do
        QueryPerformanceCounter Time_now    ' Comparer le Repère temps au temps qui
        dif = (Time_now - Time_memo) * 1000000 / Frq_Base  ' s'écoule
    Loop Until dif > MicroS          ' Si pause pas suffisante recommencer
  End If
End Sub

Historique

22 avril 2005 00:06:47 :
pb.

Commentaires et avis

signaler à un administrateur
Commentaire de nr le 22/04/2005 08:28:00

Très interressant, je cherchais ca depuis un bout de temps !

Merci

signaler à un administrateur
Commentaire de Obi le 22/04/2005 09:40:06

Ca utilise 100% du processeur ta fonction wait, nan ?
Faudrait pouvoir dire à VS que cette fonction n'à pas la priorité...

signaler à un administrateur
Commentaire de rylryl le 22/04/2005 12:24:21

Merci a vous!
Oui c'est un peu gourmand mais pour s'attaquer aux µS !!!
Cependant grâce a Kenavo une petite amélioration est possible la voili...

'//////////////////////////
'// Attendre N microSeconde
Private Sub DelayUS(MicroS)
    Dim Frq_Base As Currency, Time_memo As Currency, Time_now As Currency
    Dim dif As Long
        
    If QueryPerformanceFrequency(Frq_Base) Then ' Base fréquence systême
    QueryPerformanceCounter Time_memo ' Repère temps
    dif = Time_memo + Round(MicroS * Frq_Base / 1000000) ' Calcul fait une seule fois
    Do
        QueryPerformanceCounter Time_now
    Loop Until Time_now >= dif       ' Si pause pas suffisante recommencer
    End If
End Sub

a+
ryl...

signaler à un administrateur
Commentaire de ticomic le 22/04/2005 17:54:50

C pas sa que ca fait sleep?

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

Ou c'est autre chose?

signaler à un administrateur
Commentaire de ticomic le 22/04/2005 18:02:40

Et pk pas avec gettickcount?

Private Sub pausep(ByVal tempsenmilisecondes As Long)
Dim ti As Long
ti = GetTickCount

1
If GetTickCount - ti < tempsenmilisecondes Then GoTo 1
End Sub

Je sais que je parle bcp lol, mais c juste pour apprendre

signaler à un administrateur
Commentaire de rylryl le 22/04/2005 18:42:37

Bonjour ticomic,

"Sleep" ne gêre que les milliSecondes et d'une façon assez grossiere ainsi que "GetTickCount"...
Le code que je propose est capable de gerer les microSecondes et même au dela mais bon déja les microSecondes c'est pas mal !!!

voili...
a+
ryl...

signaler à un administrateur
Commentaire de jessoulabrute le 22/04/2005 23:12:45

C cool

signaler à un administrateur
Commentaire de draluorg le 23/04/2005 01:43:43

salut a tous,

wai mais c'est pas une pause c'est juste occuper le proco en lui faisant faires des boucles inutilement
si tu veux faire des micro pause pour ralentir un peu l'application autant faire des

for i = 1 to 10
doevents
next i
ca reviendra au meme mais en plus simple

signaler à un administrateur
Commentaire de jack le 23/04/2005 01:49:24 administrateur CS

Salut
Les microsecondes : faut peut-être pas trop rêver :
Combien de temps le processeur met-il pour interpreter tes instructions ?
Il y a de fortes chances pour que cela dure un peu plus longtemps qu'une microseconde.
En ce qui concerne GetTickCount : Cette horloge est précise à la milliseconde (garanti). Par contre, c'est le programme qui va attendre après une valeur particulière qui pénalisera la précision.
Vaste sujet déjà maintes fois évoqué sur le forum (des posts interminables de centaines de réponses ...)

signaler à un administrateur
Commentaire de rylryl le 23/04/2005 11:41:29

Bonjour draluorg,
Le fait de faire une boucle "for next" c'est bien zoli mais tu n'auras pas les mêmes temps de "pause" sur des machines différentes (vitesse pross) donc pas utilisable.

ryl...

signaler à un administrateur
Commentaire de rylryl le 23/04/2005 11:55:16

Salut Jack,
As tu fait quelques tests de comparaison entre mon code et GetTickCount constate tu une derive ?
J'ai utilisé ce code c'est vrai sous delphi dans un thread pour en faire ça :
http://www.delphifr.com/code.aspx?ID=30841
Je prepare la même chose pour VB comme ça ,ça fera un exemple concret !
Donc a trés bientôt !!

ryl...


signaler à un administrateur
Commentaire de rylryl le 23/04/2005 18:01:25

Alors Jack que donnent tes tests exactement ?
bon pas bon ?

a+
ryl...

signaler à un administrateur
Commentaire de mekid_6 le 28/04/2006 16:03:49

salut je suis nouveau dans le tas. Le probleme est que meme avec for et sleep on arrive pas a avoir une bonne vitesse, précisement avec for(i=0;i<3;i++) j'ai une vitesse visible a la sortie du port. je sais pas si quelqu'un a deja rencontré se probleme et peut m'apportert une solution
d'avance merci!

signaler à un administrateur
Commentaire de rylryl le 28/04/2006 18:15:54

Bonjour Mekid_6,

Tu utilise du C ce n'est pas le bon forum ici c'est du VB...
Regarde dans ce code il y a la même routine:
http://www.cppfrance.com/codes/PORT-PARALLELE-CONTROLEZ-MEDIAPLAYER-AVEC-TELECOMMANDE-TV-VCR_37224.aspx

Voili...
A+
ryl...

signaler à un administrateur
Commentaire de LOFLO le 25/09/2006 16:13:13

Je ne suis vraiment pas sur qu'en utilisant les QueryPerformanceCounter et QueryPerformanceFrequence on puisse obtenir des tempos à la micro-seconde (voir 1000 µS) .

Je suis en train de développé une application en VB qui doit récupérer des données depuis une carte analogique sur PC , J'ai essayé vos fonctions  car j'ai besoin de récuperer des données à 1000 µS (1 mS) , mon problème est que le délais de 1000 µS n'est pas toujours respecté. il arrive qu'il y ai des crêtes de 2000µS ou 3000 µS. Je pense que c'est Windows qui gère cela.

Y a t il un autre moyen pour palier à cela ?  (peut être en faisant un morceau d'assembleur)
ou un programme dans une session DOS sous Windows ?  

Salutations
Long

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

VBA - WORD [ par Blanche ] Je désire faire une pause lors de l'exécution de la macro afin de permettre à l'utilisation de faire des corrections dans le document. Donc, une paus Ah ! les services NT ! [ par RVTT ] Salut, Voila, je devellope une petite application qui permet a bernard de 'couper' ce qui risque de faire planter une gravure en cour. Il click sur un comment mettre en pause? [ par mike ] Existe-t-il une procédure qui permet de mettre en pause le programme pendant un temps donné?Par exemple si je clique sur un bouton, une image s'affich urgent pause système [ par Cyberdevil ] Hello,Je fais comment pour faire une pause dans le système,c'est à dire que tout le programme en chargement ou en exécution soit "pauser" En faite je Recherche le nom d'une fonction [ par eltaris ] Existe t-il une fonction qui mette le programmeen "pause" pendant un temps que l'on choisit ?ex : si je tape Pause(5), le programme s'arrête pendant5 Faire une pause dans un programme [ par nino208 ] Bonjour,je recherche l'écriture d'une fonction Delay (de pause dans un programme) sans faire de boucle (ça consomme de la CPU) mais en utilisant un ti Faire une pause dans un programme [ par nino208 ] Bonjour,je recherche l'écriture d'une fonction Delay (de pause dans un programme) sans faire de boucle (ça consomme de la CPU) mais en utilisant un ti faire une pause (pas en durée) [ par FleX ] ben voila c surement un trc tout con mais n'empeche ke je me prend la tete....Voila mon souci : g un prog qui fait une traitement (avec la form1)et qu


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 3,151 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.