[Résolu]Timer et minuit

turnoff

XLDnaute Nouveau
Bonjour
Je souhaite lire une valeur depuis un port série avec une fréquence d’échantillonnage de l’ordre de la seconde ou une fraction de seconde.
J'ai bien trouvé une procédure, mais la surveillance peut s'étaler sur plusieurs jours et l'utilisation de "timer" plante à 0 heure.
Connaissez vous une solution simple et pas trop longue ( devant 500ms)

upload_2018-3-13_15-22-57.png

Merci
 

Dranreb

XLDnaute Barbatruc
Dans le classeur joint il y a un UserForm1 où une procédure évènement S_Échoit s'exécute avec une fréquence de 25Hz.
Ça utilise un module standard MRythmeur et un module de classe Rythmeur permettant de définir des variables objets de ce type.

Attention: le mot clé PtrSafe peut gêner sur Excel 2007 si ça ne tourne pas sur une architecture à 64bits de bus adresse. Si c'est le cas, simplement l'enlever.
 

Pièces jointes

  • RythmeurCls(Timer).xlsm
    22.6 KB · Affichages: 11

Dranreb

XLDnaute Barbatruc
Je n'ai pas envie d'installer ces dll chez moi, je n'en ai sans doute pas l'usage. Est-ce que mon RythmeurCls(Timer).xlsm tourne chez toi ?
Il y a dans le module MRythmeur des exemples clairs d'utilisation de SetTimer, KillTimer et une procédure ÉvènementDeWindows exécutée périodiquement.
Pour utilisation dans un module objet tel qu'un UserForm il y a l'objet Rythmeur qui permet de se poser encore moins de questions, vu qu'il n'a que deux méthodes, Lancer et Stopper, une propriété en lecture seule Lancé permettant de savoir s'il est actif et qu'il génère un évènement Échoit.
 

job75

XLDnaute Barbatruc
Bonsoir les amis,

Pas essayé de comprendre ce que vous faites car ça semble compliqué, ceci va bien avec Now :
Code:
Sub Test()
Dim PauseTime, Start, n
PauseTime = 5 / 86400 '5 secondes
Do
    Start = Now
    n = n + 1
    Cells(n, 1) = Format(Now, "hh:mm:ss") 'juste pour tester
    Do While Now < Start + PauseTime: DoEvents: Loop
Loop
End Sub
Bonne nuit.
 

job75

XLDnaute Barbatruc
Bonjour turnoff, Bernard, le forum,
Il veut au moins 2 exécutions par seconde. Et si possible à intervalles réguliers.
Merci de m'avoir éclairé, en effet dans ce cas Now ne va pas, il faut continuer avec Timer :
Code:
Sub Test()
Dim PauseTime, Start, n, t
PauseTime = 0.5 '0,5 seconde
Do
    Start = Timer
    n = n + 1
    With Cells(n, 1) 'juste pour tester
        .NumberFormat = "hh:mm:ss.00"
        .Value = Start / 86400
    End With
    Do
        DoEvents
        t = Timer
    Loop While IIf(t < Start, t + 86400, t) < Start + PauseTime 't < Start passé minuit
Loop
End Sub
C'est très simple, dans la 2ème boucle on ajoute 86400 secondes au Timer passé minuit.

Le résultat est encore très satisfaisant avec PauseTime = 0.1 - un peu moins avec PauseTime = 0.05.

Bonne journée.
 

turnoff

XLDnaute Nouveau
Bonjour
Désolé, hier soir je me suis couché tôt (avant minuit ;) mais n'ai pas très bien dormi!!
Donc levé tard...
Danreb, je comprends que tu ne veuilles pas installer ces OCX.
Job75 ta proposition semble plus à ma porté, j'essaie.
Je suis un "lent" et n'écris que ce que je comprends lentement.
Monter sur les épaules des "grands", mais pas tomber. Sinon tout se bloque.
En tout cas j'ai appris, merci à vous!
Auriez vous une réponse, au sujet de ma question de principe précédente. Comment VB sort du "DoEvents" pour vérifier la condition de sortie de boucle?
Comme nous, il met un réveil ? ;)
Ce serait bien pour faire du temps réel de disposer d'interruption temporel, mais bon; je peine déjà.

Bonne journée à tous
 

turnoff

XLDnaute Nouveau
Mes salutations à tous...

Job75 ta proposition me convient, merci beaucoup.
Danreb , dans la recherche de documentation sur les outils que tu me proposais je suis tombé chez Microsoft sur "
QueryInterruptTime function
C'est la gestion d'interruption? Mais bon, en C et pour W10.
Je suis largement dépassé de part mes possibilités et mes outils (VB6, XL2007 et XPsp3)
J'ai bien un poste sous W10 mais il ne va pas à l'atelier, c'est un "vieux" portable avec Rs232 qui reste près du four et ne connais plus internet.


Merci aux piliers et fondateurs de ce forum, c'est une belle et bonne chose...

Comment marquer résolu?
 

Dranreb

XLDnaute Barbatruc
Comment VB sort du "DoEvents" pour vérifier la condition de sortie de boucle
Il en sort dès qu'il n'a plus de tâches de fond en attente d'exécution comme des traitement d'évènements tels que l'appui sur une touche et bien d'autres, donc tout de suite le plus souvent, je pense.
J'ai oublié des mentionner GetTickCount qui renvoie le nombre de millisecondes écoulées depuis le lancement de l'ordi. Plus simple à utiliser que QueryPerformanceCounter s'il s'agit simplement d'une boucle d'attente.
Declare [PtrSafe] Function GetTickCount Lib "kernel32.dll" () As Long
 

job75

XLDnaute Barbatruc
Re,

Pour contrôler le processus placez tout ce code dans un même module :
Code:
Option Explicit 'facultatif, déclaration des variables obligatoire
Dim marche As Boolean 'mémorise la variable

Sub Stopper_Processus()
marche = False
End Sub

Sub Lancer_Processus()
If marche Then Exit Sub 'évite la relance de la macro quand elle tourne
Dim PauseTime, Start, n, t
marche = True
PauseTime = 0.5 '0,5 seconde
Do
    If Not marche Then Exit Do 'sort de la boucle pour arrêter la macro
    Start = Timer
    n = n + 1
    With Cells(n, 1) 'juste pour tester
        .NumberFormat = "hh:mm:ss.00"
        .Value = Start / 86400
    End With
    Do
        DoEvents
        t = Timer
    Loop While IIf(t < Start, t + 86400, t) < Start + PauseTime 't < Start passé minuit
Loop
End Sub
Les macros Lancer_Processus et Stopper_Processus peuvent être affectées à des boutons.

A+
 

Statistiques des forums

Discussions
312 158
Messages
2 085 831
Membres
102 997
dernier inscrit
sedpo