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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    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 émérite Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

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

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    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 confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    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
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    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 confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    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 ?
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

+ 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