none
faire une boucle infinie mais finie vb RRS feed

  • Question

  • bonjour a toutes et tous

    je viens encore et toujours ici chercher de l'aide pour mon programme qui avance doucement mais surement et avec votre aide !

    cette fois ci, je souhaiterai faire une pause dans mon code mais qui n'a pas de temps prédéfini. je m'explique : j'appuye sur un button et le code qui est derriere se lance (normal) et quand je clic a nouveau sur ce dernier j'aimerai creer une pause jusqu'a un nouveau clic sur ce meme bouton. je pensais faire une "boucle infinie mais finie". mais j'ai l'impression que ca marche pas : voici ce que j'ai fait :

    If button.BackColor = Color.Green Then While button.Enabled = False button.BackColor = Color.Yellow End While button.BackColor = Color.Green endif

    est ce que ce code la est bon ?

    que faut il changer ?

    merci de vos reponses et de votre aide

    cordialement

    Lunick

    mercredi 26 septembre 2012 05:18

Réponses

  • Bonjour,

    J'ai fait un petit test de boucle Infinie mais fini ^^ bon il est bien tard :/ mais ça pas pris long.

    Voici le code de la classe à implémenter :

    Imports System.Threading
    
    
    Public Class MyPause
    
        Public Delegate Sub Finish()
        Public Event OnFinished As Finish
    
        Private _Continue As Boolean
        Private _thread As Thread
    
        Public Sub Pause()
            _Continue = True
            _thread = New Thread(New ThreadStart(AddressOf BreakIt))
            _thread.Start()
        End Sub
    
        Private Sub BreakIt()
            While _Continue
                'rien à faire boucle infinie
            End While
            'boucle finie
            RaiseEvent OnFinished()
        End Sub
    
        Public Sub EndPause()
            'quitter la boucle infinie
            _Continue = False
        End Sub
    
    End Class
    

    Utilisation :

    Public Class Form1
        Dim _pause As MyPause
        Dim msg As String = "Hello world"
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show("Avant")
            _pause.Pause()
        End Sub
    
        Private Sub test()
            'fin de pause
            'MessageBox.Show(msg)
            MessageBox.Show("Après")
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            _pause.EndPause()
        End Sub
    
        Public Sub New()
    
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
    
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            _pause = New MyPause()
            AddHandler _pause.OnFinished, AddressOf Me.test
        End Sub
    End Class
    

    Projet : http://dl.free.fr/fWsAhcfbR

    Au clique sur "Afficher message" va apparaître "Avant" et au clic du 2ème va apparaître "Après". Ceci avec une vrai pause ;)

    Est-ce que c'est le résultat voulu ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    • Marqué comme réponse Lunick mardi 2 octobre 2012 09:29
    jeudi 27 septembre 2012 23:59
  • Bonjour Lunick,

    Est-ce ça que tu veux ?

    Option Explicit On
    Public Class Form1
      Dim etat As Boolean = True
    
      Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Select Case etat
          Case True
            MsgBox("Desactivé", vbInformation)
            ' code si besoin...
          Case False
            MsgBox("Activé", vbInformation)
            ' code si besoin...
        End Select
        etat = Not etat
      End Sub
    End Class

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse Lunick mardi 2 octobre 2012 09:29
    mercredi 26 septembre 2012 06:43

Toutes les réponses

  • Bonjour Lunick,

    Est-ce ça que tu veux ?

    Option Explicit On
    Public Class Form1
      Dim etat As Boolean = True
    
      Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Select Case etat
          Case True
            MsgBox("Desactivé", vbInformation)
            ' code si besoin...
          Case False
            MsgBox("Activé", vbInformation)
            ' code si besoin...
        End Select
        etat = Not etat
      End Sub
    End Class

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse Lunick mardi 2 octobre 2012 09:29
    mercredi 26 septembre 2012 06:43
  • bonsoir,

    merci pour la reponse.

    c'est un peu l'idee que j'ai sauf que je souhaiterai mettre ca dans une fonction qui est appelle plusieur fois au cours du code!

    comment transformer ce que vous avez fait EhJoe pour le mettre dans une fonction ?

    merci de votre aide

    bonne soiree

    Cordialement

    Lunick

    mercredi 26 septembre 2012 19:56
  • Bonjour Lunik,

    - Si mes réponses en valent la peine tu peux me mettre un point en cliquant dans chacune de mes réponses en haut à gauche sur le triangle vert.

    - Si la réponse finale te convient tu peux cliquer en bas de ma dernière réponse sur "proposer comme réponse"

    Merci :o)

    *

    Pour ta question :

    Oui, tu peux aussi réutiliser une procédure, c'est presque pareil, comme suit :

    Quand tu veux appeler la procédure tu fais :

    Call Button1_Click(sender, e)

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    mercredi 26 septembre 2012 20:11
  • La reponse a ma question doit etre toute bete : quand je mets Call Button1_Click(sender, e) dans ma fonction, il me dit que sender et e ne sont pas déclarer. Je dois les declarer comme suit dim sender as ??, dim e as ?? , ou faut il faire autre chose ?

    merci pour votre aide

    cordialement

    Lunick

    mercredi 26 septembre 2012 20:21
  • suite,

    Oui c'est ça :

    Sub x()
        ' CAST
        Dim sender As System.Object = 0
        Dim ee As System.EventArgs = Nothing
        Call Button1_Click(sender, ee)
    End Sub
    
    Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("ok")
    End Sub

    En fait dans le cast tu reprends en variable locale le type de "senders" et de "e" de la procédure à laquelle tu veux t'adresser, les mettant à vide, sauf si tu veux leur passer une valeur pour la procédure appelée qui va reprendre la valeur comme une fonction...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe jeudi 27 septembre 2012 05:54
    • Proposé comme réponse EhJoe vendredi 28 septembre 2012 06:44
    • Non proposé comme réponse EhJoe vendredi 28 septembre 2012 13:35
    mercredi 26 septembre 2012 20:42
  • Bonjour,

    J'ai fait un petit test de boucle Infinie mais fini ^^ bon il est bien tard :/ mais ça pas pris long.

    Voici le code de la classe à implémenter :

    Imports System.Threading
    
    
    Public Class MyPause
    
        Public Delegate Sub Finish()
        Public Event OnFinished As Finish
    
        Private _Continue As Boolean
        Private _thread As Thread
    
        Public Sub Pause()
            _Continue = True
            _thread = New Thread(New ThreadStart(AddressOf BreakIt))
            _thread.Start()
        End Sub
    
        Private Sub BreakIt()
            While _Continue
                'rien à faire boucle infinie
            End While
            'boucle finie
            RaiseEvent OnFinished()
        End Sub
    
        Public Sub EndPause()
            'quitter la boucle infinie
            _Continue = False
        End Sub
    
    End Class
    

    Utilisation :

    Public Class Form1
        Dim _pause As MyPause
        Dim msg As String = "Hello world"
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show("Avant")
            _pause.Pause()
        End Sub
    
        Private Sub test()
            'fin de pause
            'MessageBox.Show(msg)
            MessageBox.Show("Après")
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            _pause.EndPause()
        End Sub
    
        Public Sub New()
    
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
    
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            _pause = New MyPause()
            AddHandler _pause.OnFinished, AddressOf Me.test
        End Sub
    End Class
    

    Projet : http://dl.free.fr/fWsAhcfbR

    Au clique sur "Afficher message" va apparaître "Avant" et au clic du 2ème va apparaître "Après". Ceci avec une vrai pause ;)

    Est-ce que c'est le résultat voulu ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    • Marqué comme réponse Lunick mardi 2 octobre 2012 09:29
    jeudi 27 septembre 2012 23:59
  • bonjour,

    merci a Lyamine et a EhJoe pour vos reponses et aides !

    j'ai pris ce que vous m'avez donné, je les ai transformé pour les inserer dans mon programme et quand j'execute le programme j'ai pas le resultat que je souhaite avoir !

    que ce soit sur ce qu'a fait EhJoe ou Lyamine, ca fait la meme chose (pour moi) a l'execution :

    -clic sur le bouton : lancment du programme

    -nouveau clic : pause du programme

    -clic suivant : reprise du programme, au debut de la sequence. (c'est la ou ca bloque !)

    en lisant vos codes, j'ai l'impression que le programme fait une "simple" pause et reprend le code la ou il etait arrete, mais qu'en realite il fait une pause et revient a son point de depart (donc au debut de la sequence). je me trompe surement, non ?

    c'est vrai que je me suis peut etre mal exprime sur ce que je cherche a faire ; c'est pourquoi je vais essaye de m'explique plus clairement ici :

    j'ai un button1 qui quand je clique dessus me lance une sequence. j'aimerai a l'aide du button1 (ou d'un button2) faire une pause indéfinie. A la fin de la pause, je clique a nouveau sur le  button1 (ou le button2) et la sequence reprend la ou l'utilisateur l'avait mis en pause ! (j'aimerai pouvoir faire entre aucune et une infinité de pauses).

    Est ce que les codes qui m'ont ete proposé repondent a ca ou j'ai rien compris ?

    merci de votre aide

    cordialement

    Lunick

    vendredi 28 septembre 2012 12:38
  • bonjour,

    merci a Lyamine et a EhJoe pour vos reponses et aides !

    j'ai pris ce que vous m'avez donné, je les ai transformé pour les inserer dans mon programme et quand j'execute le programme j'ai pas le resultat que je souhaite avoir !

    que ce soit sur ce qu'a fait EhJoe ou Lyamine, ca fait la meme chose (pour moi) a l'execution :

    -clic sur le bouton : lancment du programme

    -nouveau clic : pause du programme

    -clic suivant : reprise du programme, au debut de la sequence. (c'est la ou ca bloque !)

    en lisant vos codes, j'ai l'impression que le programme fait une "simple" pause et reprend le code la ou il etait arrete, mais qu'en realite il fait une pause et revient a son point de depart (donc au debut de la sequence). je me trompe surement, non ?

    c'est vrai que je me suis peut etre mal exprime sur ce que je cherche a faire ; c'est pourquoi je vais essaye de m'explique plus clairement ici :

    j'ai un button1 qui quand je clique dessus me lance une sequence. j'aimerai a l'aide du button1 (ou d'un button2) faire une pause indéfinie. A la fin de la pause, je clique a nouveau sur le  button1 (ou le button2) et la sequence reprend la ou l'utilisateur l'avait mis en pause ! (j'aimerai pouvoir faire entre aucune et une infinité de pauses).

    Est ce que les codes qui m'ont ete proposé repondent a ca ou j'ai rien compris ?

    merci de votre aide

    cordialement

    Lunick

    Vous souhaitez faire en quelque sorte comme le débuter? Ou même comme un lecteur mp3 plat pause?

    Si c'est bien cela, j'ai une idée en tête mais a tester


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 28 septembre 2012 13:18
  • Bonjour Lunik,

    Ben... dans mon code il n'y avait pas de pause mais simplement une indication sur la façon
    d'inverser un état alternativement, puis de le tester afin de faire quelque chose ou rien selon ce que tu voulais.

    Il en découle par syllogisme que c'est la façon dont tu utilise tout ça qui ne doit pas être la bonne. Ce que tu demandes n'est pas difficile a priori, toutefois encore faut il le connaître... Si le code revient à son point de départ c'est que c'est mal codé.

    Pour tes questions :

    Le code reprend à l'endroit où tu as mis la pause, le pointeur du programme se positionnant à l'octet qui suit l'instruction de la pose quand cette dernière est levée. Cependant il y a des cas ou la pause peut ne pas être exécutée si préalablement le code prend la main avant la pause (je vois déjà un cas, c'est celui du DoEvents juste avant par exemple). En dernier sur ce point, un programme est surveillé en permanence et en boucle par l'O.S, alors si jamais il ne répond pas un certain temps il peut survenir au pire des dysfonctionnements, et au mieux un message t'indiquant que le programme ne répond plus. Donc un pause de longue durée, comme susdit n'est pas indiquée pour un programme, le code doit tourner, au moins les attentes d'évènements, or si plus rien ne bouge à cause de la pause le résultat n'est pas garanti, il faut mettre un Timer qui permet de faire tourner les routine de test d'évènements... sauf à faire un programme avec un fichier batch à la rigueur.

    Quant à faire rentrer une "infinité de pauses", je présume que c'est l'une après l'autre...

    *

    Pour suivre ton programme il y a le debugger, mais le mieux à mon sens est de faire un fichier LOG, ceci à condition que tu saches faire un fichier, et de mettre toutes les informations au endroits voulus qui sont à écrire dans le fichier. Ainsi tu peux ensuite voir par où est passé ton code et en déduire ce qui ne va pas et où ça ne va pas (toutes les grosse application généralement sont aidées d'un fichier LOG, souvent à la conception, voire après lors de l'utilisation (Les produits Microsoft font ainsi en grande partie quand des erreurs surviennes, il pond un fichier LOG ou équivalent)).

    Si tu ne sais pas tracer un code avec un fichier LOG, demande ! Je te dirais :o)

    *

    Alors, de facto, pour ne pas que ta question perdure saecula saeculurum, le mieux serait que tu m'envoies le code par mail. Tu peux me contacter en bas de mon message, ensuite via les mails on peut régler le problème ; car ici, tu ne produis pas assez de code pour qu'il puisse être corrigé, et vue la question je doute que tu fasses un travail professionnel, donc il n'y a pas de secret à sauvegarder...

    Au plaisir, cordialement ;o)


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe vendredi 28 septembre 2012 13:35
    vendredi 28 septembre 2012 13:32
  • Merci pour votre aide.

    Faire un mode play-pause comme pour les mp3, c'est un ca oui Lyamine ! Je serais preneur de ce que vous avez en tete, si vous souhaiter partager !!

    Pour EhJoe :

    une infinite de pause c'est une pause puis une reprise puis une pause.... tant que la sequence n'est pas finie, je peux faire une pause, c'est ca que je veux dire !

    Faire un fichier LOG, oui pas de soucis mais debutant dans la programmation, je ne sais pas encore faire ca ! ca viendra je pense !

    Pas de travail professionnel, juste un travail de plaisir ! donc je solliciterai bien votre aide par mail ! je vous envois le bout de code qui me fait travailler cette pause ?

    merci de m'avoir aide

    cordialement

    Lunick

    vendredi 28 septembre 2012 13:55
  • Je suis actuellement sur mon tel. Donc chaud pour écrire surtout pour des longs messages. En rentrant j'explique mais ce n'est qu'une théorie.

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 28 septembre 2012 14:12
  • Il n'y a pas de soucis !

    si l'explication vient que demain, ce n'est pas grave !

    cordialement

    Lunick

    vendredi 28 septembre 2012 14:23
  • Lunik, suite,

    Ça vient à pied ou à cheval   :o))))

    Le mieux est de mettre la totalité du programme dans un dossier nouveau, puis de le ziper avec le mail.

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 28 septembre 2012 14:28
  • je suis toujours a l'heure du tam tam, donc ca met un peu plus de temps que d'ordinaire !

    le programme fait juste 400 MB, et que meme zippé il fait  pas grand chose en moins !

    j'ai mis en piece jointe du mail le "bout" de code ou je souhaite implanter cette pause !

    cordialement

    Lunick

    vendredi 28 septembre 2012 14:56
  • Pour réduire la taille,faite un nettoyage du projet depuis VS. Ca va supprimer les fichiers binaires inutiles

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 28 septembre 2012 15:39
  • Bonsoir,

    j'ai effectue ce nettoyage, mais l'application est toujours aussi volumineuse !! et ceci est du a la quantite monstre de fichier audio et images dans les ressources du programme !

    sans ces derniers, le projet pourrait etre transmis par mail !

    A EhJoe : avez vous recu mon mail ?

    Merci

    Cordialement

    Lunick

    vendredi 28 septembre 2012 19:14
  • Bonjour Jérôme,

    Ah de la signalisation ferroviaire, je connais, je suis rentier des conducteurs de trains où j'ai fait une carrière à la RATP (Métro), mais je connais en gros la signalisation SNCF, car le RER RATP tourne avec cette dernière, même si j'étais au métro où là c'est un peu différent dans les signaux, mais ça reste une signalisation d'espacement et de positionnement (pour les manoeuvres de changement de voies).

    C'est un code très C# que tu as mis là...

    Voici un code qui te permet de pister ton code (exemple) :

    ' copier coller ce code dans un programme nouveau et lancer, le programme se ferme ensuite tout seul et affiche le fichier log
    ' fichier LOG form1 (Lunik_jérôme)
    
    Option Explicit On
    Public Class Form1
      Dim msgLog As String = ""
      Dim pft As New System.IO.StreamWriter(My.Application.Info.DirectoryPath & "\train.log")
      ' création du fichier log en mode écrasement si existe à chaque lancement
      ' le fichier ne se fermera qu'à la sortie du programme pour être consulté manuellement (fichier txt)
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        msgLog = "lancement " & Now : Call ecritLOG()
      End Sub
    
      Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        msgLog = "programme train affiché" : Call ecritLOG()
        msgLog = " " : Call ecritLOG() ' saute une ligne
        Dim i As Integer = 0 ' simultion d'appel de procédures au hasard
        Dim hasard As Integer = 0
        msgLog = "SHOWN simule les appels aux procédures" : Call ecritLOG()
        For i = 1 To 5
          Randomize()
          hasard = Int((3 - 1 + 1) * Rnd() + 1)
          Select Case hasard
            Case 1
              msgLog = "SHOWN simule appel procédure bouton7" : Call ecritLOG()
              Call Bouton7()
            Case 2
              msgLog = "SHOWN simule appel procédure modeA" : Call ecritLOG()
              Call modeA()
            Case 3
              msgLog = "SHOWN simule appel procédure mode_jour_nuit_jour" : Call ecritLOG()
              Call mode_jour_nuit_jour()
          End Select
          msgLog = "SHOWN valeur de i" & i : Call ecritLOG()
        Next i
        msgLog = "SHOWN fin de simulation" : Call ecritLOG()
        Me.Close() ' fin du programme va en bas (closing)
      End Sub
    
      Sub ecritLOG()
        pft.WriteLine(msgLog)
      End Sub
    
      ' EXEMPLES
      Sub Bouton7()
        msgLog = "procédure bouton7" : Call ecritLOG()
        msgLog = " " : Call ecritLOG() ' saute une ligne
      End Sub
    
      Sub modeA()
        msgLog = "procédure modeA" : Call ecritLOG()
        Dim i As Integer = 3
        msgLog = "valeur de i  " & i : Call ecritLOG()
        msgLog = " " : Call ecritLOG() ' saute une ligne
      End Sub
    
      Sub mode_jour_nuit_jour()
        msgLog = "procédure : mode_jour_nuit_jour" : Call ecritLOG()
        Dim i As Integer = Now.Second
        Select Case i
          Case 0, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58
            msgLog = "avant pause 250" : Call ecritLOG()
            System.Threading.Thread.Sleep(250)
            msgLog = "après pause 250" : Call ecritLOG()
          Case 1, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59
            System.Threading.Thread.Sleep(500)
            msgLog = "après pause 500" : Call ecritLOG()
          Case Else
            msgLog = "avant pause 750" : Call ecritLOG()
            System.Threading.Thread.Sleep(750)
        End Select
        msgLog = "sortie du select case" : Call ecritLOG()
        msgLog = "valeur de i  " & i : Call ecritLOG()
        msgLog = " " : Call ecritLOG() ' saute une ligne
      End Sub
    
      Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ' la form est en train de se fermer, elle ferme le fichier log qui va pouvoir être consulté manuellement (txt)
        ' le fichier train.log se trouve dans ...\BIN\DEBUG\ par défaut.
        pft.Close()
        Dim i As Integer = Shell("notepad.exe " & CStr(My.Application.Info.DirectoryPath & "\train.log"), vbNormalFocus)
      End Sub
    
    End Class
    

    D'après ce que tu dis, si tu as 2 modes mais un seul à la fois, qui ensuite vont déboucher sur 2 choix chacun, mais les mêmes, tu peux faire un code qui évite les complications :

    - Utilises 2 boutons radios pour les modes, comme ça un seul peut être actionné, ceci dans un Panel X 2 fois (propriétés = apparence = Button et "Checked" (true/false).

    Ainsi avec un code du genre :

    Dim etat as byte = 1
    Dim lumiere as byte = 0
    ' ...
    select case etat ' 1 ou 2
     case 1 ' cas 1
       select case lumière
        case 0 ' éteint
         ' code...
        case 1 ' allumé
         ' code....
       end select
     case 2 ' case 2
       select case lumière
        case 0 ' éteint
         ' code...
        case 1 ' allumé
         ' code....
       end select
    end select
    

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe samedi 29 septembre 2012 00:19
    vendredi 28 septembre 2012 22:27
  • Bonjour,

    Je te laisse t'en occuper Joseph ? La méthode que je pensais faire est Obsolète :/

    Je suis en mur réflexion sur le système de pause en pleine exécution du coup.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    samedi 29 septembre 2012 09:59
  • Jérôme (Lunik),

    Y a un truc que je ne comprends pas là, il me semblait avoir lu que le programme PC était un pilote via une carte pour une maquette ferroviaire physique. Or que viennent faire les vidéos et autres sur ton PC, quelle rapport avec la maquette ferroviaire ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    samedi 29 septembre 2012 11:26
  • bonjour,

    je viens de voir tout ce que vous avez fait pour m'aider ! je mettrais ca en oeuvre dans l'apres midi si j'ai le temps ou demain (mais avant tout, les etudes !)

    Le pc est bien un pilote pour les cartes de la maquette du reseau et les photos sont la que pour le visuel au niveau des form (une image rend mieux qu'un fond uni et triste qu'est la couleur par defaut !) et les sons ne sont que des annonces pour les trains (qui sont jouées manuellement pour le moment!).

    ici un apercu de l'onglet des lampes. on peut voir une image en fond et les commandes liées aux lampes. c'est ici que je veux ajouter le bouton pause !

    Initialement, le programme servait uniquement a allumer/eteindre un bloc de lampes a la fois et a commander les feux (si un au vert, les autres au carré, normal non ?). puis petit a petit, j'ai mis des fonctionnalites pour que ca soit plus attrayant, plus securisant et plus vivant :mettre un bouton pour "ouvrir" les cartes, mode de sequence d'allumage et d'extinction des lampes (manuelles et automatiques), feux qui clignotent, annonces sonores dans la gare (arrivee, depart et retard de trains, ainsi que diverses annonces que l'on peut entendre dans une gare)... et un jour, lorsque j'aurai le temps de le faire, faire tourner les trains grace au pc (mais avant, faut faire et tester les montages electroniques de detection de trains sur les voies et implanter un programme pour tout gerer. mais on n'en est encore loin !)

    Donc finalement, ce que je veux faire se passe que dans le bout de code que je vous ai envoyé. Mais il est vrai que si vous voulez faire des essais de code sur ce que j'ai fait pour mettre cette maudite pause, la totalite du programme serait utile !

    cordialement

    Lunick

    PS : Lunick prend un C avant K, mais c'est pas grave ! ;)

    samedi 29 septembre 2012 12:21
  • Jérôme, ok, tu me diras quand tu auras installé ton fichier log, et que tu auras localisé où est l'endroit qui ne te convient pas (lundi...).

    Tu mediras aussi avec des boutons radios si ça supprimer bien comme tu le voulais la possibilité de comamnder deux choses contradictoires à la fois (mettre chaque groupe de deux dans un panel : capital).

    Pour le fichier, vois chez ton FAI s'il autorise à charge de gros fichier en FTP, et dans ce cas tu peux me faire ensuite un hyperlien.

    Pour ta maquette, de nos jours on ne touche plus guère à l'éclairage, y compris dans les trains à l'air libre pour y mettre la lumière dans les tunnels (c'est différent pour les métros évidemment), on utilise une cellule, et c'est elle qui décide (elle peut être reprise en manuel), mais peut être que sur ta maquette ce serait trop onéreux d'avoir ce type de système...

    A mon sens et faute de pouvoir conduire les trains, l'intérêt depuis un PC est de faire des incidents de lignes, de mettre un train en rade puis de faire des services provisoires au niveau des poste d'aiguillage, voire des VUT (voie unique temporaire (avec un bâton pilote)). Tout en tenant compte des fins de service des personnels de conduite, qu'ils terminent dans leur terminus (échange en ligne de conducteurs)... Avec un PCE (PC énergie), tu peux aussi simuler des marches lentes quand EDF te dis qu'il dispose de moins de courant pour toi durant x heures, mais c'est moins intéressant...

    Ça diffère un peu, à la SNCF le carré (deux rouges je crois), correspond au métro à un seul rouge (mais en gardant toujours un section tampons entre deux trains, ce qui n'est pas le cas à la SNCF, qui au premier rouge fait un stop, puis repart jusqu'au carré au cul du train de devant.

    Où as-tu appris tout ça, es-tu un amateur passionné de ferroviaire, veux-tu y travailler (comme quoi) ?

    C'est quoi tes études ?

    Bon, alors à bientôt, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    samedi 29 septembre 2012 12:54
  • Jérôme, ok, tu me diras quand tu auras installé ton fichier log, et que tu auras localisé où est l'endroit qui ne te convient pas (lundi...).

    Tu mediras aussi avec des boutons radios si ça supprimer bien comme tu le voulais la possibilité de comamnder deux choses contradictoires à la fois (mettre chaque groupe de deux dans un panel : capital).

    Pour le fichier, vois chez ton FAI s'il autorise à charge de gros fichier en FTP, et dans ce cas tu peux me faire ensuite un hyperlien.

    Pour ta maquette, de nos jours on ne touche plus guère à l'éclairage, y compris dans les trains à l'air libre pour y mettre la lumière dans les tunnels (c'est différent pour les métros évidemment), on utilise une cellule, et c'est elle qui décide (elle peut être reprise en manuel), mais peut être que sur ta maquette ce serait trop onéreux d'avoir ce type de système...

    A mon sens et faute de pouvoir conduire les trains, l'intérêt depuis un PC est de faire des incidents de lignes, de mettre un train en rade puis de faire des services provisoires au niveau des poste d'aiguillage, voire des VUT (voie unique temporaire (avec un bâton pilote)). Tout en tenant compte des fins de service des personnels de conduite, qu'ils terminent dans leur terminus (échange en ligne de conducteurs)... Avec un PCE (PC énergie), tu peux aussi simuler des marches lentes quand EDF te dis qu'il dispose de moins de courant pour toi durant x heures, mais c'est moins intéressant...

    Ça diffère un peu, à la SNCF le carré (deux rouges je crois), correspond au métro à un seul rouge (mais en gardant toujours un section tampons entre deux trains, ce qui n'est pas le cas à la SNCF, qui au premier rouge fait un stop, puis repart jusqu'au carré au cul du train de devant.

    Où as-tu appris tout ça, es-tu un amateur passionné de ferroviaire, veux-tu y travailler (comme quoi) ?

    C'est quoi tes études ?

    Bon, alors à bientôt, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    Salut Joseph,

    C'est pour ça qu'on a que des problèmes sur la ligne A ?? (LOL)

    C'est cool si tu as bossé sur ce sujet, tu peux mieux l'aiguiller ( :O le jeu de mot) ! Pour le moment j'ai pas trouvé de solution pour faire une pause et reprendre là où sa en était. Je ne sais pas si je dois continuer à chercher ou ce n'est plus la peine ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    samedi 29 septembre 2012 13:23
  • pour permettre la non utilisation des boutons durant les modes, je passe les bouton a false et a la fin de la sequence a true! peut pas le plus simple ni le plus ergonmique, mais ca marche !

    l'eclairage ne correspond pas a l'eclairage des trains mais a l'eclairage des maquettes ( = maisons). L'eclairage des trains est "automatique", c'est a dire que si j'ai du jus dans les rails et que le contact des roues sur les rails est bon alors les lampes s'allument, sinon c'est le noir complet dans la voiture (=wagon)!

    Avant de faire des VUT et PCE et autre incidents, faudrait juste avoir le temps de mettre en place la detection des train ce qui n'est pas encore fait (electroniquement que informatiquement)! Une fois ca en place, je ne manquerait de faire des pannes et autres "problemes normaux" comme la SNCF en a le secret !

    oui, le carré c'est deux rouges et le semaphore un seul (qui est souvent accompagné d'un oeilleton blanc pour dire au chauffeur de train que c'est bien un semaphore et non un carre dont l'un des rouges aurait grille).

    Je suis un amateur oui, et c'est aussi un peu ma passion ! alors que certains prefere les jeux videos et autres activités qui abrutissent, je me sens plus a l'aise avec un train a controler qu'une manette pour jouer a je ne sais quel jeu sans interet ni but (ce n'est que mon point de vue et je ne veux offenser personne !).

    Je suis actuellement en Licence 2eme année d'informatique. Et vu ce qu'on apprend et ce qu'on a appris, je ne suis pas encore capable de faire ce genre de chose (pause), mais dans pas longtemps peut etre !!

    je vois pour vous envoyer le projet par lien hypertexte, et je mets les LOG en place ! par contre, je vois pas pourquoi mettre un LOG en place si le projet tourne bien ! Pouvez vous me donner une explication simple sur le but de ce fichier? merci.

    Cordialement

    Lunick

    samedi 29 septembre 2012 14:18
  • Salut Lyamine,

    Eh le code il reprend après la pause hein, à l'octet suivant l'instruction de la pause, suffit de faire ce code pour le voir :

    Option Explicit On
    Public Class Form1
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Timer3.Interval = 250
        Timer3.Enabled = True
        Label1.Text = ""
      End Sub
    
      Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("code avant la pause")
        System.Threading.Thread.Sleep(3000)
        MsgBox("code après la pause")
        Button2.Visible = False
        Timer3.Enabled = False
        Reset()
        End
      End Sub
    
      Sub Timer3_Tick(sender As System.Object, e As System.EventArgs) Handles Timer3.Tick
        Label1.Text = My.Computer.Clock.TickCount
      End Sub
    
      Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        MsgBox("clique bouton 2")
      End Sub
    
    End Class

    Avec le timer (3) j'affiche le temps écoulé depuis le lancement du PC dans un label, ça simule un programme qui tourne, ensuite quand je lance la pause, après le msgbox ça arrête le timer, preuve qu'il faut éviter la pause car ça bloque tout ! Si je clique sur le bouton 2 durant la pause, ça n'y va pas, et quand la pause se lève, même quand le msgbox s'affiche avec son incrémentation, le programme tourne à nouveau. Idem avec un DoEvents devant la pause.

    Conclusion : la pause stoppe tout le programme, et après la pause en séquence c'est l'instruction suivante qui est lue, alors si ça ne fait pas ça, c'est que les instructions qui suivent la pause ne sont pas adaptées...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    samedi 29 septembre 2012 14:50
  • Bonjour Jérôme,

    L'œilleton confirme que le CDV (circuit de voie) en aval est libre (sauf panne de ce dernier), il permet de franchir en effet un signal rouge avec la certitude que devant c'est dégagé.

    Quand on met des voyageurs ce sont des voitures, quand il n'y a pas de voyageur ce sont des wagons, c'est une grosse faute qu'on entend toujours à la télévision de dire "wagon" quand il y a des voyageurs. C'est un peu comme les confusions entre revolver et pistolet, avec détente et gâchette...

    Ah ton alimentation de traction se fait par les rails de roulement, sans doute avec l'alimentation de signalisation sur des fréquences différentes et des ponts d'induction...

    Toujours allumé à l'intérieur même quand il fait jours, ça dépend peut être des modèles...

    Non non, je respecte cette passion, d'autant que parfois ça va très loin avec de magnifiques circuits et trains... Mais alors, pourquoi ne pas entrer à la SNCF comme conducteur ou agent de maîtrise (licence) ?

    *

    Le fichier LOG, tu m'as dit que tu ne savais pas trop où était ton problème de reprise après pause, alors c'est à ça qu'il va servir. Il faut simplement mettre des écritures aux endroits que tu penses critiques, et s'il n'y a rien d'anormal tu étends les écritures fichiers.

    Non ! Chaque objet a une prédestination de base, or choisir parmi plusieurs état, un état et un seul, c'est le bouton radio et pas un autre ; après certes tu fais ce que tu veux et comme tu le veux.

    Si ton code ne vas pas où tu le voudrais après la pause, ça ne vient pas de la pause, voir ce que j'ai répondu avec exemple à Lyamine.

    Je t'ai montré l'utilisation d'un "select Case" dans mon code, c'est de cette façon qu'il faut procéder car cette fonction a le mérite d'évider les erreurs de code puisque seule un instruction peut être utilisée à la fois, ça évite des "IF imbriqués boiteux, surtout avec des Else"...

    Tu écris : ... "le projet tourne bien" ... alors la question est résolue, non ?

    Cordialement.


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    samedi 29 septembre 2012 15:25
  • Salut Lyamine,

    Eh le code il reprend après la pause hein, à l'octet suivant l'instruction de la pause, suffit de faire ce code pour le voir :

    Option Explicit On
    Public Class Form1
    
      Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Timer3.Interval = 250
        Timer3.Enabled = True
        Label1.Text = ""
      End Sub
    
      Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("code avant la pause")
        System.Threading.Thread.Sleep(3000)
        MsgBox("code après la pause")
        Button2.Visible = False
        Timer3.Enabled = False
        Reset()
        End
      End Sub
    
      Sub Timer3_Tick(sender As System.Object, e As System.EventArgs) Handles Timer3.Tick
        Label1.Text = My.Computer.Clock.TickCount
      End Sub
    
      Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        MsgBox("clique bouton 2")
      End Sub
    
    End Class

    Avec le timer (3) j'affiche le temps écoulé depuis le lancement du PC dans un label, ça simule un programme qui tourne, ensuite quand je lance la pause, après le msgbox ça arrête le timer, preuve qu'il faut éviter la pause car ça bloque tout ! Si je clique sur le bouton 2 durant la pause, ça n'y va pas, et quand la pause se lève, même quand le msgbox s'affiche avec son incrémentation, le programme tourne à nouveau. Idem avec un DoEvents devant la pause.

    Conclusion : la pause stoppe tout le programme, et après la pause en séquence c'est l'instruction suivante qui est lue, alors si ça ne fait pas ça, c'est que les instructions qui suivent la pause ne sont pas adaptées...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    Salut Joseph,

    Oui le blocage est normal car tu fais un Thread.Sleep, cette instruction réagis sur le thread principal qui est celui de la fenêtre principale. pour éviter ce genre de problème, faut soit utiliser un Thread (Dim _thread as Thread = New Thread(Address Of <la procédure à lancer>) ) ou plus simple un BackgroundWorker. Avec ça la fenêtre ne sera plus bloquée.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    samedi 29 septembre 2012 22:26
  • Bonjour Lyamine,

    As-tu et si tu veux un mail pour contact direct (voir en bas mon mail si tu veux me passer le tien) ?

    Ben je ne connaissais pas ces deux autrs méthodes, pour ma part j'utilise la pause que deux ou trois secondes, et encore, et une ou des fois, je n'en abuse pas.

    Si j'ai besoin de plus, j'envoie dans un timer et au test (if timer1.enabled = true then exit sub).

    Mais l'idéal est peut être de tout simplement enregistrer les variables avant le débranchement, débrancher, puis repartri où on était sorti en testant préalablement l'état de sortie, on restaure les variables, on envoie goto à la reprise et ça repart ; cette méthode demeure assez souple...

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    dimanche 30 septembre 2012 07:19
  • Bonjour a tous,

    J'ai vu diverses réponses qui me semble être les bonnes (mais je n'ai pas tout lu trop d'historique ^^)

    le mieux, ou peut être le plus judicieux, ne serait il pas de prendre le contrôle Backgroundworker  il sert a géré les Threads une pause et l'annulation en cas de besoin !

    J’espère que vous trouvez la solution entre toute les réponses que vous avez.

    cordialement,


    Cordialement,

    lundi 1 octobre 2012 17:47
    Auteur de réponse
  • Bonjour a tous,

    J'ai vu diverses réponses qui me semble être les bonnes (mais je n'ai pas tout lu trop d'historique ^^)

    le mieux, ou peut être le plus judicieux, ne serait il pas de prendre le contrôle Backgroundworker  il sert a géré les Threads une pause et l'annulation en cas de besoin !

    J’espère que vous trouvez la solution entre toute les réponses que vous avez.

    cordialement,


    Cordialement,

    bonsoir,

    Oui cette poste a été évoquée plus haut. ;)

    JOSEPH J'ai bien reçu ton mail mais en ce moment je n'ai pas trop de temps. =/


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    • Proposé comme réponse EhJoe lundi 1 octobre 2012 21:37
    lundi 1 octobre 2012 19:05
  • Bonjour a tous,

    lorsque je mets "le projet tourne bien", c'est qu'il fonctionne bien sans mettre une pause de duree inderminée. par contre, lorsque j'en mets une il me donne des erreurs a l'execution, du genre "ne repond plus" (lorsque je fais une boucle de verification de l'etat des boutons), et aussi avec ce que vous me proposer (l'erreur ne vient pas de ce que vous me proposer mais dans la facon dont je mets en place ces derniers !!).

    Donc finalement, je me tate entre mettre une pause et ne pas en mettre... premiere raison : j'ai un du mal a l'implanter et la seconde, apres reflexion, l'utilisateur lance la sequence deja programme et donc doit la laisser finir. parce que apres plusieurs  demande d'utilisation a des personnes tierses au programme, la pause n'apporte pas grand chose, car l'utilisateur peut se servir de l'application complete a l'exception de la commande des lampes ! Apres je sais pas si vous voyez ce que je veux dire... mais l'idee est que la pause ne servirait a rien au bout du compte !

    Alors je pense que ma questions a suffisament de reponse pour qu'elle soit resolu ! je sais pas ce que vous en pensez ?

    Mais au final, ce probleme de pause reviendra surement pour moi lorsque j'implanterai le controle des trains et donc gerer le tout ! alors je garde tout ce que vous m'avez proposé !

    Aussi, cela peut servir pour d'autre personne qui seront dans le meme cas que moi !

    Merci a vous tous d'avoir essayé de répondre a ma question

    Cordialement

    Lunick

    mardi 2 octobre 2012 09:28
  • Bonjour a tous,

    lorsque je mets "le projet tourne bien", c'est qu'il fonctionne bien sans mettre une pause de duree inderminée. par contre, lorsque j'en mets une il me donne des erreurs a l'execution, du genre "ne repond plus" (lorsque je fais une boucle de verification de l'etat des boutons), et aussi avec ce que vous me proposer (l'erreur ne vient pas de ce que vous me proposer mais dans la facon dont je mets en place ces derniers !!).

    Donc finalement, je me tate entre mettre une pause et ne pas en mettre... premiere raison : j'ai un du mal a l'implanter et la seconde, apres reflexion, l'utilisateur lance la sequence deja programme et donc doit la laisser finir. parce que apres plusieurs  demande d'utilisation a des personnes tierses au programme, la pause n'apporte pas grand chose, car l'utilisateur peut se servir de l'application complete a l'exception de la commande des lampes ! Apres je sais pas si vous voyez ce que je veux dire... mais l'idee est que la pause ne servirait a rien au bout du compte !

    Alors je pense que ma questions a suffisament de reponse pour qu'elle soit resolu ! je sais pas ce que vous en pensez ?

    Mais au final, ce probleme de pause reviendra surement pour moi lorsque j'implanterai le controle des trains et donc gerer le tout ! alors je garde tout ce que vous m'avez proposé !

    Aussi, cela peut servir pour d'autre personne qui seront dans le meme cas que moi !

    Merci a vous tous d'avoir essayé de répondre a ma question

    Cordialement

    Lunick

    Bonjour Lunick,

    Oui le programme ne répond pas car tu fais une pause dans le thread principal (Thread.Sleep(xxms). Si tu veux que le programme fonctionne sans ce problème, il faut utiliser soit un nouveau thread (System.Threading.Thread), soit utiliser le contrôle BackgroundWorker. Comme cité plus haut.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mardi 2 octobre 2012 09:32