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.NET Discussion :

Appeler plusieurs fois une procedure


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut Appeler plusieurs fois une procedure
    Bonsoir,

    J'aimerai appelé plusieurs fois une meme procédure.
    Cette procédure ferme un relai, lance un timer puis ouvre le relai après un certain laps de temps.

    Je voudrais appelé cette procédure plusieurs fois avec un petit temps d'attente entre chaque fois. ( le temps que le relai ai le temps de s'ouvrir)

    Je vous remercie de vos conseils éclairés.

    Cordialement,

    Innuendo67

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonsoir,

    Si je comprends bien, ta procédure gère un Timer et une commande un relais.
    En principe, ta procédure devrait Starter un Timer et c'est le Tick de ce dernier qui devrait actionner le relais.
    S'il en est bien ainsi, il devrait être facile d'écrire une 2ème procédure qui activerait un Timer2 dont le Tick appellerait ta procédure actuelle.

    Avec quelques extraits de ton code (ta procédure, le paramétrage du Timer et le code du Tick), je pourrai peut-être t'en dire plus.

    A bientôt,

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    De ce que je comprend, l'action sur le relais est autonome ?
    Je ferme le relais, j'active une tempo puis j'ouvre le relais ?
    De façon perpétuel?

    Si c'est bien cela le seule timer peut gère cela !

    A chaque tic il incrémente l'étape 1,2,3,4,1 et en fonction du select case de la variable ouvre le relais,temporise,ferme,temporise.

    Il peut prendre en compte parallèlement des instruction start,stop,sécurité !

  4. #4
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Bonjour et merci pour vos réponses!


    Je compare l'heure du pc à une liste d'heure. Si l'heure de la liste = heure du PC alors: la procédure ci-après:

    Voici mon 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
    Private Sub monter()
     
            heuremonter = Format(Now, "dd/MM/yyyy HH:mm:ss")
     
            If Timermonter.Enabled = False Then
                Timermonter.Start()
     
            End If
     
                      'procédure qui ferme le relai
     
        End Sub
     
     
    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles monter.Tick
     
    ' je sais qu'il y a plus simple que dateadd
     
            If (DateAdd(DateInterval.Second, 1, heuremonter) = Format(Now, "dd/MM/yyyy HH:mm:ss")) Then
     
     
              'procédure qui ouvre le relai
     
                monter.Stop()
                heuremonter = Nothing
     
    'timer qui compare l'heure du PC à une liste d'heure (planificateur)
                Timer1.Start()
     
     
            End If
     
     
        End Sub
    Je souhaite comparer deux entiers et en fonction de la différence, appelé x fois ces procédures.
    ex: 7-2 = 5 donc appeler 5 fois la procédure.

    Je vous remercie.

    Cordialement,

    Innuendo67

  5. #5
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    S'il n'y a pas à compter les durées d'enclenchement et/ou de déclenchement, s'il suffit d'appeler N fois la procédure quand tu le décides (que se soit en fonction de l'heure ou d'un timer), tu peux exécuter l'appel dans une boucle For i = 1 to N ....

    Je dois dire que je vois pas très bien le rôle du Timer dès lors que tu travailles sur les heures, d'autant que ton code ne montre pas l'Interval du Timer ...

  6. #6
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Je compare date et heure d'une liste à la date et heure du pc avec un timer principal. Ici timer1. L'intervalle du timer 1 est de 10ms de façon à ne pas rater l'heure ( je ne suis précis qu'à la seconde près)
    Si date et heure égales alors je lance ma sub monter.

    Ca c'est ok.

    Là je voudrais forcer un horaire. Du coup, entre l'horaire initial et le forcé il y aurait peut être eu n fois la sub monter.

    Donc je calcules ce n et voudrais exécuter n fois ma sub monter. L'interval du timer monter et de 10ms également.

    Je ne sais pas si c'est clair... pas évident a l'écrit ! Merci encore!

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Dysortorthographie à raison, avec un seul Timer c'est très bien.

    Voici une application d'expérimentation, à peaufiner sûrement, mais qui te mettra sur la voie : MachineOnOff.zip

    Bon amusement,


    Nom : MachineOnOff.jpg
Affichages : 248
Taille : 26,9 Ko

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Ok ... enfin je crois ...

    mais alors, qu'est-ce qui t'empêche d'appeler la procédure dans une boucle For ?

    ...

    En y regardant de plus près, je vois que tu gères un Timer dans la procédure Monter. Il ne convient donc pas de l'appeler plusieurs fois sans égard au travail en cours du Timer.
    Par ailleurs cette procédure contient aussi "la fermeture du relais" : lors des appels successifs, le code va exécuter la fermeture du relais déjà fermé (cela n'est sans doute pas dommageable).

    Sans doute, faudrait-il revoir toute l'organisation du code ...

  9. #9
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Bonjour,

    Oui l'exécuter au sein d'une boucle est difficile ou alors essayer d'incrementer la boucle en fonction d'autres variables. Je vais essayer de réorganiser tout ca!

    Donc, hormis une boucle, il n'y a aucun moyen d'appeler une procédure plusieurs fois ( arguments ou autre?).

    Merci je vais tenter des choses autrement et reviendrai vers vous.

    Cordialement,

    Innuendo67

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Je crois que la difficulté est de tenter d'appeler plusieurs fois ce qui lance (ou arrête) le Timer.
    S'il ne s'agissait que de commander le relais, la boucle For ferait l'affaire.
    Bon courage ...

  11. #11
    Invité
    Invité(e)
    Par défaut
    bonjour,
    je vois toujours pas pourquoi Timermonter,Timer1 et Timer2, alors qu'il me semble un seul timer suffirait!

    explique nous ce que tu veux faire.

  12. #12
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Bonsoir,

    J'ai un timer principal, ici timer1.
    Dans le tick de ce timer, je compare la date et l'heure du pc à une date et heure d'une liste.

    Chaque date et heure de cette liste correspond à une action (déclencher des relais ou autre).
    Si ça déclenche un relai, je dois maîtriser son temps de fermeture.
    Je lance donc un autre timer, ici timer monter. Timermonter et monter c'est le meme. Timer2 c'est monter.

    Je voudrais aller à une heure de ma liste mais qui n'est pas la prochaine action ( peut être avancer d'un jour pourquoi pas). Du coup, entre l'horaire "normal" et le forcé, il y a peut être plusieurs fois l'action monter.

    Je calcule ce nombre de fois et je voudrais jouer monter ce nombre de fois.

    Je crois que je vais essayer de créer des horaires temporaires pour simuler des horaires existants de facon à jouer l'action normalement. En créant pourquoi pas une nouvelle liste.

    Ou si vous voyez autre chose? Ça devient compliqué pour moi ...

    Merci!

  13. #13
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonsoir,

    Le 7/6 (#4), je t'ai envoyé une application de test : elle permet l'enclenchement d'un relais (simulé par un Label) pour une durée prédéfinie et de le stopper pendant une durée également définie.
    Peut-être pourrais-tu te servir de cette application (qui fonctionne avec 1 seul Timer) pour expérimenter une solution à ton problème car, finalement, ce que tu veux, c'est cliquer N fois le bouton d'enclenchement. Tu peux donc essayer manuellement sur mon application et constater ce qui se passe ...
    Je pense qu'enclencher plusieurs fois le relais de manière automatique est possible pour autant qu'il ait le temps de terminer son cycle (enclenchement + pause + déclenchement + pause) entre chaque clic du bouton.

    Quand cela fonction, il suffira d'appeler BOn_Click(Me, Nothing) dans une boucle For, avec une temporisation entre chaque tour ...

    ...

  14. #14
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Bonsoir Phil, et les autres,

    Oui c'est vrai j'avais oublié de te remercier!

    Je vais regarder cela attentivement. Si je reprends mon code cela pourrait m'aider.

    Merci!

    Innuendo67

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'ai créé un classe Relais qui dois contenir tout le code d'action sur le relais X?
    et un formulaire.

    en phase d'initialisation je j'implémente un ListView et une collection qui pour l'exemple contient deux relais (R1,R2) chaque relais dispose de son propre timer et à chaque Tick inspecte le ListView et en fonction ouvre ou ferme le relai!


    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Public Class Form1
        Dim Rx As New Dictionary(Of String, Relais)
        Dim Lst As New ListView
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim Line(3) As String
            Lst.View = View.Details
            Lst.Columns.Add("Relais")
            Lst.Columns.Add("Date")
            Lst.Columns.Add("Heure")
            Lst.Columns.Add("OnOff")
            Line(0) = "R1" : Line(1) = "2019-06-11" : Line(2) = "08:55:00" : Line(3) = "1" : Lst.Items.Add(New ListViewItem(Line))
            Line(0) = "R1" : Line(1) = "2019-06-11" : Line(2) = "22:55:00" : Line(3) = "0" : Lst.Items.Add(New ListViewItem(Line))
            Line(0) = "R2" : Line(1) = "2019-06-11" : Line(2) = "16:55:00" : Line(3) = "1" : Lst.Items.Add(New ListViewItem(Line))
            Line(0) = "R2" : Line(1) = "2019-06-11" : Line(2) = "17:55:00" : Line(3) = "0" : Lst.Items.Add(New ListViewItem(Line))
     
            Rx.Add("R1", New Relais("R1", Lst)) : Rx("R1").Interval = 1 : Rx("R1").Marche()
            Rx.Add("R2", New Relais("R2", Lst)) : Rx("R2").Interval = 1 : Rx("R2").Marche()
        End Sub
    End Class
    Public Class Relais
        WithEvents tim As New Timer
        Private _ReleaiOnOff As Boolean, _Relai As String, _Lst As ListView
        Public Sub New(ByVal Relai As String, ByRef Lst As ListView)
            _Relai = Relai : _Lst = Lst
        End Sub
        Private Sub tim_Tick(sender As Object, e As EventArgs) Handles tim.Tick
            Dim r As String = ""
            Dim d As DateTime = DateTime.Now
            Dim Conflicts = From ListItem In _Lst.Items.Cast(Of ListViewItem)()
                            Where ListItem.SubItems(0).Text = _Relai And ListItem.SubItems(1).Text = d.ToString("yyyy-MM-dd") And ListItem.SubItems(2).Text = d.ToString("hh:mm:ss")
                            Select ListItem.Index
     
            For Each i In Conflicts
                _ReleaiOnOff = If(_Lst.Items(i).SubItems(3).Text.ToString = "1", True, False)
            Next
            If _ReleaiOnOff Then
                fermer(_Relai)
            Else
                ouvrir(_Relai)
            End If
        End Sub
        Private Sub fermer(ByVal Relai As String)
     
        End Sub
        Private Sub ouvrir(ByVal Relai As String)
     
        End Sub
        Public Sub Marche()
            tim.Start()
        End Sub
        Public Sub Arret()
            tim.Stop()
        End Sub
        Public Property Interval As Integer
            Get
                Return tim.Interval
            End Get
            Set(value As Integer)
                tim.Interval = value
            End Set
        End Property
        Public Property ReleaiOnOff As Boolean
            Get
                Return _ReleaiOnOff
            End Get
            Set(value As Boolean)
                _ReleaiOnOff = value
            End Set
        End Property
    End Class
    Dernière modification par Invité ; 11/06/2019 à 12h07.

  16. #16
    Membre averti
    Homme Profil pro
    autre
    Inscrit en
    Septembre 2015
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : autre
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2015
    Messages : 35
    Par défaut
    Bonsoir à tous et merci pour vos réponses et le temps consacré à mon problème.

    J'ai finalement réussi à gérer mon probleme en générant x horaires fictifs en fonction de l'écart que j'avais.
    Je lance ensuite un timer dans une boucle qui lance monter, s'arrête et reprend à la fin de monter jusqu'à la fin de la boucle.
    Je contrôle les horaires fictifs de facon à ce que la séquence de fermeture ouverture des relais n'empiète pas sur les horaires normaux du programme.

    Je ne sais pas si c'est très clair!

    Le code est moche mais fonctionnel. Je le rends donc plus simple et clair maintenant.

    Merci encore!!

    Innuendo67

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/02/2017, 13h16
  2. Load d'une page appelé plusieurs fois
    Par rv26t dans le forum ASP.NET
    Réponses: 6
    Dernier message: 24/12/2009, 14h31
  3. [Struts javascript] ouvrir plusieurs fois une popup
    Par jc_romeo dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/03/2006, 09h36
  4. Réponses: 5
    Dernier message: 05/01/2006, 18h43
  5. [VB] Passer plusieurs parametres à une procedure stockée
    Par wolflinger dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/04/2005, 14h13

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