IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Interruptions système et rafraichissement de Timer


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 31
    Points
    31
    Par défaut Interruptions système et rafraichissement de Timer
    Bonjour à tous,

    Petit problème de principe que je soumets à la communauté, sachant que j'ai résolu ce problème en le contournant. Mais j'aime bien approfondir et comprendre les choses, alors si quelqu'un a une explication...

    Le contexte : Je veux créer une animation en VBA Excel, et contrôler un temps de pause entre deux affichages successifs d'une image (mais pas toujours le même temps). Pour pouvoir régler cette durée, j'ai créé une sub "Test" dans laquelle je calcule le temps écoulé à partir de la variable "Timer".

    Voici le code de la sub Test, qui est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Test
      K0=0 ' Variable de comptage
      T0=Timer ' Temps de début de boucle
      Do
        K0=K0 +1 ' Comptage
        T1=Timer ' Temps de fin de boucle
      Loop until T1<> T0 ' Fin de boucle dès qu'une variation de Timer est détectée
    End Sub
    Petite précision : L'exemple ci-avant est simplifié, car en réalité Timer ne s'affiche qu'avec 2 décimales. En réalité, j'ai donc modifié mes variables pour prendre en compte la 4ème décimale de Timer. Mais ceci ne change rien au problème, car je constate avec surprise qu'avant que la variable T1 n'affiche une valeur supérieure à celle du départ T0 (et donc que la boucle Do / Loop se termine), mon compteur K0 affiche une valeur qui peut varier de 500 à parfois plus de 20 000. Et c'est trop long pour mon animation.

    Sur le principe, j'ai contourné le problème avec une boucle For / Next qui s'exécute tout au début du programme, et dans laquelle j'incrémente une variable pendant une seconde, ce qui me donne une référence de comptage pour le 1/100 ou même le 1/1000 ème de seconde, ceci permettant de pallier les différences de rapidité d'un ordinateur à un autre.

    Autre surprise : Entre le début et la fin de la boucle, la valeur de Timer (lue à la 4ème décimale) n'évolue pas de façon régulière : Parfois à peine plus de 0.01 seconde, parfois plus de 0.02 seconde. Je suppose donc qu'il y a quelque part des interruptions système qui d'une part expliquent ces différences de résultat, et surtout qui empêchent que l'indicateur Timer ne soit mis à jour plus rapidement.

    Question : Peut-on empêcher ces interruptions système (et lesquelles ?), ou tout simplement accélérer ou forcer le rafraichissement de Timer ?
    Autre précision : J'ai essayé d'employer les instructions "Application.EnableEvents = False", "Application.Calculation = xlManual" ou "'Application.ScreenUpdating = False", mais rien n'a changé...

    Merci d'avance !

    JR

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tu parle de interruption timer mais de quel timer je ne vois que le sub test

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    en voila une drole d'idée???????
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test
      K0=0 ' Variable de comptage
      T0=Timer ' Temps de début de boucle ' ici cela va te donner un nombre
      Do
        K0=K0 +1 ' Comptage
        T1=Timer ' Temps de fin de boucle ' ici tu récupere une nouvelle fois le timer ce sera donc un nouveau nombre a quelque millieme pres 
      il est donc inutile de boucler avec until (jusqu'a) puisque que les 2 variable (T0/T1)soit différentes, puisqu'elle le sont d'office forcement 
    Loop until T1<> T0 ' Fin de boucle dès qu'une variation de Timer est détectée
    End Sub
    
    
    resultat tel quel ta boucle do loop ne fait meme par un aller retour elle passe une seul fois c'est tout
    enfin j'espere avoir été clair
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 31
    Points
    31
    Par défaut Précision pour rdurupt
    Merci de t'intéresser au sujet...

    Timer est la variable système qui permet de donner les indications sur la date et l'heure.

    Ce que je veux dire, c'est qu'il a l'air de se passer plein de choses avant que cette variable soit mise à jour, et j'aimerais comprendre lesquelles...
    Et surtout pouvoir rafraichir cette variable plus rapidement.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 31
    Points
    31
    Par défaut Réponse à Patricktoulon
    He bien non, il se trouve que la variable Timer peut rester la même pendant pas mal de temps puisque ma variable de comptage K0 évolue de façon très significative sans que Timer ait bougé...

    Teste toi même ce petit bout de code, c'est surprenant.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut RE
    ALORS TU A UN SERIEUX PROBLEME DE PROCESSEUR OU DE MEMOIRE

    un coup d'aspirateur la dedans ne fera pas de mal

    non sans rire il y a bien u soucis
    et au passage j'ai testé et j'ai bien 2 nombres différents des le départ chez moi

    et puis tester la différence entre 2 pointage du timer n'est peut etre pas la bonne solution

    je verrais plutot un test sur timer + x par rapport a un précedent pointage du timer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub test 
    t0=timer
    do 
    'faire ceci ou cela 
    loop until timer=t0+1000
    end sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Invité
    Invité(e)
    Par défaut
    Dans mon jeune temps, vue qu'il n'existait pas de fonction timer, je déroutai en turbo pascal interruption 1C.

    C'est l'interruption de retour Timer qui met horloge du système à jour!

    Microsoft l'avait prévu pour les applications en développement, il la maintenant récupérer pour implémenter le Timer dont nous parlons actuellement.

    Sachant que les interruption commence à 0 le Timer n'est ça priorité!!!

    Si tu fais un compte et au tu ne le synchronise pas avec l'heur système le décalage ce fait en fonction du Timer!

    Par les exemple 1000 pulsations par secondes, quoi qu'il arrive tu reset ton compteur aux passage des secondes!

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Merci !

    Je crois effectivement que j'ai un problème, mais pas lié au processeur, plutôt à ma version Excel (2003) ou bien au format d'affichage de Timer, que je n'arrive à lire qu'à la deuxième décimale.

    Cela étant, j'utilise cette variable "Timer" depuis pas mal d'années et je pense bien la maitriser, sauf qu'ici j'ai voulu la tester en dessous d'un centième de seconde... Et je ne sais toujours pas comment manipuler les interruptions...

    Pas grave, je clos le débat, merci à tous.
    JR

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Declare Function GetTickCount Lib "Kernel32" () As Long
    Sub TIM()
       Dim T As Long, T2 As Long
       T = GetTickCount
       T2 = T
     
       Do While Abs(T2 - T) < 15
             T = GetTickCount
       Loop
    MsgBox T2 - T
    End Sub
    Dernière modification par Invité ; 02/09/2015 à 21h12.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 31
    Points
    31
    Par défaut @ rdurupt
    Je viens d'analyser ton code. Je ne connaissais pas la fonction GetTickCount, mais elle répond exactement à ce que je cherchais.

    Ma boucle "Do/Loop Until T1 - T0 > 0.001" ne fonctionnait pas avec la variable Timer car le résultat n'était jamais inférieur à 15 millièmes de seconde, mais elle fonctionne parfaitement avec GetTickCount. Et je ne chercherai pas à savoir pourquoi !

    Travailler au millième de seconde me permet d'ajuster mes paramètres. SUPER !!

    Un grand merci à toi !!

  11. #11
    Invité
    Invité(e)
    Par défaut
    GetTickCount te permet de lire le temps écoulé dupuis l'ouverture de ta session Windows!

    De plus c'est plus précis que Timer!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2008, 19h42
  2. Interruption Timer sous Borland C
    Par Spacy_green dans le forum C
    Réponses: 3
    Dernier message: 20/06/2006, 23h40
  3. PBM Display / Rafraichissement / timer...
    Par fredfred dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 22/05/2006, 10h59
  4. Réponses: 4
    Dernier message: 08/02/2006, 08h31
  5. [JList et Timer] Rafraichissement
    Par Shiftane dans le forum Composants
    Réponses: 3
    Dernier message: 27/12/2005, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo