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

VB 6 et antérieur Discussion :

timer se bloque


Sujet :

VB 6 et antérieur

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Points : 98
    Points
    98
    Par défaut timer se bloque
    bonsoir à tous

    je fais des acquisitions des données et je les enregistre dans une base acces, cette procédure se fait dans un timer, mais le problème est que ce dernier se bloque de temps en temps pendant quelques secondes et reprend (sans intervention de ma part).

    y a t-il une explication

    merci d'avance

  2. #2
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 168
    Points
    1 168
    Par défaut
    Rajoute des dans les boucles un peu longues à exécuter

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Points : 98
    Points
    98
    Par défaut
    je l'ai ajouté au début de la procédure timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Private Sub Timer1_Timer()
    Dim ut As Single, up As Single
    doevents
    tj = tj + 1
    Text2.Text = (tj * Timer1.Interval) / 1000
    Form7.Text2.Text = Text2.Text
    t8t = -aqc(0)    'procédure  relative à ma carte d'acquisition (acquisition)
    y1t = (1 / (0.004 * 0.1 * t9t)) * (t8t - (0.1 * t9t))
    Text1.Text = (Int(y1t * 10) / 10)
     
    dtPlotChart.Palette(0) = MyColors(0)   'objet relatif à la carte (traçage      'des courbes)
     
    dtPlotChart.SinglePoint = y1t
     
    ut = -4.5
    envoi 0, ut     'procédure  relative à ma carte d'acquisition (envoi)
     
    '"*****************
    If rep2 = vbYes Then
    t8 = -aqc(6)
    Else
    t8 = -50
    End If
     
    y1 = 1000 * t8 / t9
    Form7.Text1.Text = (Int(y1 * 10) / 10)
    Form7.dtPlotChart.Palette(0) = MyColors(0)
    Form7.dtPlotChart.SinglePoint = y1
     
    up = 4.5
    envoi 1, up
     
    With MonRs
    .AddNew
    .Fields("TIREG") = y1t
    .Fields("UT") = ut
    .Fields("PRESS") = y1
    .Fields("UP") = up
    .Fields("DAT") = Date
    .Fields("Te") = Timer1.Interval
    .Update
    End With
     
    End Sub
    mais après un certain temps au lieux que le timer se bloque, l'application s'est plantée.

    en cas d'absence de solution, est-il possible de trouver une solution équivalente au timer( c'est à dire répéter ce code périodiquement sans utilisation de timer)

    Merci encore

  4. #4
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 107
    Points : 16 633
    Points
    16 633
    Par défaut
    Bonjour

    Une donné importante, la "fréquence" (1/t) de ton Timer (quelle valeur de .Interval ), de plus, cette valeur est elle fixe ou au moins peut elle être définie/récupérée pour toute la durée de l'utilisation du programme ?

    Une autre chose, comme dans la sub Timer1_Timer il y a des simplifications mathématiques possibles,
    il serait intéressant de voir ta procédure (fonction ?) aqc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t8t = -aqc(0)    'procédure  relative à ma carte d'acquisition (acquisition)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ut = -4.5
    envoi 0, ut     'procédure  relative à ma carte d'acquisition (envoi)
    La procédure envoi ne risque t elle pas de durer plus longtemps que ton .Interval ?
    Et d'autres interrogations qui peuvent largement expliquer ton problème

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Points : 98
    Points
    98
    Par défaut
    bonjour

    Merci pour vos réponses;

    1/ timer1.interval est égal à 500 ms, cette valeur est fixée au chargement de la form et reste fixe jusqu'à la fin.

    2/ pour la procedure envoi;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub envoi(ByVal chant As Long, ByVal Volts As Single)
        Dim Value As Long
     
        On Error GoTo Trap
     
        Value = VoltsToValue(DAC, Volts)
        DAC.Config
        DAC.PutSingleValue chant, 1, Value
        Exit Sub
     
    Trap:
        ' error in the DTx-EZ system
        MsgBox DAC.LastErrDescription, 48, "Analog Out Error"
     
    End Sub
    et pour aqc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Function aqc(ByVal chant As Long) As Single
        Dim Value As Long
     
        ' Config SS now!
        ADC.Config
     
        ' Get the value
     
        Value = ADC.GetSingleValue(chant, 1)
     
        ' Convert to volts
        aqc = ValueToVolts(ADC, Value)
     
    End Function
    pour leur temps d'exécution je l'ai testé avec , il ne dépasse pas les 16 ms, donc je pense que c'est largement suffisant de prendre 500ms comme période. en outre si le problème était que le temps d'exécution des instruction au sein de timer1_timer est plus grand que la période de ce dernier, serait-il possible qu'il se bloque pendant 10 ou 20 secondes ou même plus.

  6. #6
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 107
    Points : 16 633
    Points
    16 633
    Par défaut
    Une première approche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Option Explicit
    Dim MilliInterval As Single
     
    Private Sub Form_Load()
    MilliInterval = Timer1.Interval / 1000
    'Si la couleur ne change pas au cours de la durée de l'acquisition
    dtPlotChart.Palette(0) = MyColors(0)   'objet relatif à la carte (traçage      'des courbes)
    Form7.dtPlotChart.Palette(0) = MyColors(0)
    End Sub
     
    Private Sub Timer1_Timer()
    'Dim ut As Single, up As Single
    DoEvents
    tj = tj + 1
    'Text2.Text = (tj * Timer1.Interval) / 1000
    Text2.Text = tj * MilliInterval
    Form7.Text2.Text = Text2.Text
     
    t8t = -aqc(0)    'procédure  relative à ma carte d'acquisition (acquisition)
    'y1t = (1 / (0.004 * 0.1 * t9t)) * (t8t - (0.1 * t9t))
    y1t = (1 / (0.0004 * t9t)) * (t8t - (0.1 * t9t))
    'Text1.Text = (Int(y1t * 10) / 10)
    Text1.Text = Round(y1t, 1)
     
    'Si la couleur ne change pas d'un passage à un autre
    'dtPlotChart.Palette(0) = MyColors(0)   'objet relatif à la carte (traçage      'des courbes)
     
    dtPlotChart.SinglePoint = y1t
     
    'ut = -4.5
    'envoi 0, ut     'procédure  relative à ma carte d'acquisition (envoi)
    envoi 0, -4.5     'procédure  relative à ma carte d'acquisition (envoi)
     
    '"*****************
    If rep2 = vbYes Then t8 = -aqc(6) Else t8 = -50
     
    Y1 = 1000 * t8 / t9
    'Form7.Text1.Text = (Int(Y1 * 10) / 10)
    Form7.Text1.Text = Round(Y1)
    'Si la couleur ne change pas d'un passage à un autre
    'Form7.dtPlotChart.Palette(0) = MyColors(0)
    Form7.dtPlotChart.SinglePoint = Y1
     
    'up = 4.5
    'envoi 1, up
    envoi 1, 4.5
     
    With MonRs
        .AddNew
        .Fields("TIREG") = y1t
        '.Fields("UT") = ut
        .Fields("UT") = -4.5
        .Fields("PRESS") = Y1
        '.Fields("UP") = up
        .Fields("UP") = 4.5
        .Fields("DAT") = Date
        .Fields("Te") = Timer1.Interval
        .Update
    End With
     
    End Sub
    si t9t ne change jamais de valeur,
    (1 / (0.0004 * t9t)) pourrai être le résultat, plutôt que le recalculer à chaque passage dans dans la boucle
    (t8t - (0.1 * t9t)) pourrai lui devenir (t8t - résultat de (0.1 * t9t))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If rep2 = vbYes Then
    t8 = -aqc(6)
    Else
    t8 = -50
    End If
    rep2 n'est pas modifié dans la sub Timer,
    pourquoi ne pas donner la valeur à t8 au moment de la récupération de la valeur de rep2, cela éliminerai le If .... Then dans la boucle du Timer.
    d'ou vient t9, il évolue d'un passage à un autre dans la boucle ?
    Y1 = 1000 * t8 / t9 <=== peut donc éventuellement être établie une seule fois, hors de la boucle du Timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With MonRs
    .AddNew
    .Fields("TIREG") = y1t
    .Fields("UT") = ut
    .Fields("PRESS") = y1
    .Fields("UP") = up
    .Fields("DAT") = Date
    .Fields("Te") = Timer1.Interval
    .Update
    End With
    Les modifications/transactions dans une BDs peuvent elles aussi prendre des temps différents d'une demande à une autre, non compris la quantité de
    champs à modifier/ajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .Fields("UP") = up
    .Fields("UT") = ut
    .Fields("DAT") = Date
    .Fields("Te") = Timer1.Interval
    ne changeant pas de valeur entre chaque passages dans la sub, te sont ils vraiment utile ?

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Points : 98
    Points
    98
    Par défaut
    bonsoir

    Merci bcp ProgElecT
    Une première approche
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Option Explicit
    Dim MilliInterval As Single
     
    Private Sub Form_Load()
    MilliInterval = Timer1.Interval / 1000
    'Si la couleur ne change pas au cours de la durée de l'acquisition
    dtPlotChart.Palette(0) = MyColors(0)   'objet relatif à la carte (traçage      'des courbes)
    Form7.dtPlotChart.Palette(0) = MyColors(0)
    End Sub
     
    Private Sub Timer1_Timer()
    'Dim ut As Single, up As Single
    DoEvents
    tj = tj + 1
    'Text2.Text = (tj * Timer1.Interval) / 1000
    Text2.Text = tj * MilliInterval
    Form7.Text2.Text = Text2.Text
     
    t8t = -aqc(0)    'procédure  relative à ma carte d'acquisition (acquisition)
    'y1t = (1 / (0.004 * 0.1 * t9t)) * (t8t - (0.1 * t9t))
    y1t = (1 / (0.0004 * t9t)) * (t8t - (0.1 * t9t))
    'Text1.Text = (Int(y1t * 10) / 10)
    Text1.Text = Round(y1t, 1)
     
    'Si la couleur ne change pas d'un passage à un autre
    'dtPlotChart.Palette(0) = MyColors(0)   'objet relatif à la carte (traçage      'des courbes)
     
    dtPlotChart.SinglePoint = y1t
     
    'ut = -4.5
    'envoi 0, ut     'procédure  relative à ma carte d'acquisition (envoi)
    envoi 0, -4.5     'procédure  relative à ma carte d'acquisition (envoi)
     
    '"*****************
    If rep2 = vbYes Then t8 = -aqc(6) Else t8 = -50
     
    Y1 = 1000 * t8 / t9
    'Form7.Text1.Text = (Int(Y1 * 10) / 10)
    Form7.Text1.Text = Round(Y1)
    'Si la couleur ne change pas d'un passage à un autre
    'Form7.dtPlotChart.Palette(0) = MyColors(0)
    Form7.dtPlotChart.SinglePoint = Y1
     
    'up = 4.5
    'envoi 1, up
    envoi 1, 4.5
     
    With MonRs
        .AddNew
        .Fields("TIREG") = y1t
        '.Fields("UT") = ut
        .Fields("UT") = -4.5
        .Fields("PRESS") = Y1
        '.Fields("UP") = up
        .Fields("UP") = 4.5
        .Fields("DAT") = Date
        .Fields("Te") = Timer1.Interval
        .Update
    End With
     
    End Sub
    si t9t ne change jamais de valeur,
    (1 / (0.0004 * t9t)) pourrai être le résultat, plutôt que le recalculer à chaque passage dans dans la boucle
    (t8t - (0.1 * t9t)) pourrai lui devenir (t8t - résultat de (0.1 * t9t))
    tes remarques sont tous à leurs places, je les ai pris en considération (sauf pour up et ut car j'ai l'intention des les prendre comme des variables qui changent de valeurs dans la boucle, mais tu as raison car je les ai présenté comme des constantes).

    rep2 n'est pas modifié dans la sub Timer,
    pourquoi ne pas donner la valeur à t8 au moment de la récupération de la valeur de rep2, cela éliminerai le If .... Then dans la boucle du Timer.
    c'est vrai que rep2 n'est pas modifiée dans la sub timer, elle represente un choix à faire au début pour décider si je vais faire une lecture (de tension) sur la chaine 6 (t8 = -aqc(6) ) de la carte d'acquisition ou non(dans ce cas t8 doit prendre -50), donc je ne peux pas lui donner une valeur au début car la tension acquise évolue au cours de temps (l'acquisition doit se faire de façon continue), cependant il est possible de faire le "if" au début;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if rep2=vbyes then
    rp=1
    rt=0
     else 
    rp=0
    rt=1
    end if
    et puis dans le timer je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t8=(-aqc(6)*rp)-(rt*50)
    donc je sais pas quelle alternative est à conserver

    concernant la bd; up et ut ne resteront pas constantes (comme je l'ai déjà mentionné), la date est nécessaire pour un filtrage ultérieur des données (tracer les valeurs enregistrées à telle ou telle date), seul "te" je peux l'enregistrer une seule fois au début pour chaque groupe de données (c'est à dire pour chaque jours)

    je vais appliquer ces modifications demain et voir le résultat mais je dois dire dans tous les cas que tes remarques sont vraiment utiles

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Points : 98
    Points
    98
    Par défaut
    bonsoir

    j'ai appliqué les changements mentionnées la dessus, en plus j'ai augmenté l'intervalle de timer à 1 seconde et ça marche (il ne se bloque plus)
    Merci beaucoup pour tous.

    Mais j'ai découvert un autre problème que je vais le poser dans une nouvelle discussion.
    A tout.

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

Discussions similaires

  1. [XL-2003] probleme de procedure bloqué par un timer
    Par rcec42 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/05/2011, 11h06
  2. service timer se bloque
    Par espoireproxy dans le forum SharePoint
    Réponses: 4
    Dernier message: 17/01/2011, 12h18
  3. [WD11] Timer qui bloque application
    Par ivichou dans le forum WinDev
    Réponses: 11
    Dernier message: 29/04/2010, 08h14
  4. Timer qui ne bloque pas l'interface
    Par arketip dans le forum Général Python
    Réponses: 1
    Dernier message: 14/04/2009, 19h55
  5. [Timer] timer bloqué par une boucle for?
    Par Jidefix dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 18/09/2006, 17h12

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