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 :

Gestion des Timer_Tick [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut Gestion des Timer_Tick
    Bonjour, toujours sur le même projet, je cherche à déplacer un PictureBox à chaque Tick d'un Timer. J'ai abouti au code suivant (qui ne peut pas marcher tel quel) :
    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
    Module Principal
        WithEvents Metronome As New System.Windows.Forms.Timer()    'création du Timer Metronome
     
        Sub main()
            Dim Fenetre As New Form1        'création d'une fenêtre 
            Dim Cellule1 As New PictureBox  'création d'une picturebox
     
            'initialisation cellule 1
            Fenetre.Controls.Add(Cellule1)
            With Cellule1
                .Location = New System.Drawing.Point(20, 50)
                .Size = New System.Drawing.Size(20, 20)
                .TabIndex = 0
                .Image = My.Resources.Cellule_Est
            End With
     
            'affichage initial
            Fenetre.Show()
            Cellule1.Refresh()
            System.Threading.Thread.Sleep(1000) 'juste pour visualiser le début
     
            Metronome.Interval = 500    'réglage métronome
            Metronome.Start()           'départ métronome
     
            'pour passer le temps en attendant les Ticks
            Do While 2 < 3
            Loop
     
        End Sub
     
        Sub Metronome_Tick(ByRef Dessin As PictureBox)  'pour déplacer la picturebox aux Ticks du métronome
            Dessin.Left += 1
            Dessin.Refresh()
        End Sub
     
    End Module
    Je ne vois pas comment passer le paramètre Cellule1 à la routine Metronome_Tick. Déclarer la variable Cellule1 comme Public ne me parait pas élégant. Pourriez-vous me mettre sur la voie ?
    Merci
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Puisque le Timer et la PictureBox se trouvent sur Form1, il me paraît plus logique de les définir et des les instancier dans le code correspondant à Form1. Les instance peuvent être créer dans l'événement Load de la Form par exemple. Dans ce cas, Picturebox serait une donnée Private de Form1 visible par le Timer.

    eb.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Citation Envoyé par horemheb Voir le message
    Bonjour, toujours sur le même projet, je cherche à déplacer un PictureBox à chaque Tick d'un Timer. J'ai abouti au code suivant (qui ne peut pas marcher tel quel) :
    ...
    Apparement vous êtes avec un projet application console.

    Il ne faut pas faire de boucle While infinie.
    Pour ouvrir votre fenêtre et la garder active procédez ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Imports System.Windows.Forms
     
    Module Module1
     
        Sub Main()
            Dim f As Form = New Form
            Application.Run(f)
        End Sub
     
    End Module
    Comme vous le suggére ebastien placer le reste du code dans la Form et son évènement Load.

    [Edit]Une question tout de même pourquoi partir sur une application console pour utiliser une fenêtre? Faites une appli WinForm directement. (ou alors j'ai loupé quelque chose)[/Edit]
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #4
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Bonjour, vos propositions ne règleront pas mon souci de passage de paramètre. Ce code sert de test pour mettre en place correctement les éléments de mon projet. Mon objectif actuel (phase 2) est de déplacer "simultanément" plusieurs picturebox au moyen d'autant de timers. Il faut donc un passage d'argument entre le timer et la picturebox concernée, qu'ils soient dans le module Sub main ou le Form1_Load. Il me faudrait, à la suite de Metronome.Start() une instruction du genre Metronome(Cellule1) pour envoyer à la procédure Metronome_Tick le paramètre qui manque.
    Merci de m'éclairer.
    Bonne journée.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    vous faites un list(of picturebox) et dans le timer vous faites un for each dessus

    si le déplacement est différent d'un picturebox à l'autre, il faut faire une classe ayant les paramètres du déplacement et le picturebox, puis un list(of cette_classe)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    vous faites un list(of picturebox) et dans le timer vous faites un for each dessus
    si le déplacement est différent d'un picturebox à l'autre, il faut faire une classe ayant les paramètres du déplacement et le picturebox, puis un list(of cette_classe)
    Ok Pol63 pour plusieurs mais avant il faut que j'y arrive avec un seul. Et je ne vois pas comment je peux passer mon paramètre Cellule pour que le Timer déclenche la procédure avec le bon passage de paramètre. D'autant plus nécessaire s'il y a plusieurs Timers et plusieurs procédures à gérer.

    La procédure Sub Metronome_Tick attend un passage de paramètre qui n'est réalisé nulle part. Entre Metronome.Start() et Metronome_Tick(...) il manque quelque chose, ou procéder autrement. Quoi, comment, je ne sais pas.
    Est-ce bien Metronome_Tick qui est déclenché au tick du métronome ?
    Comment passer des paramètres à un évènement ?
    C'est sur ces points que je souhaiterais avoir des précisions.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    on écrit pas ce qu'on veut dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Metronome_Tick(ByRef Dessin As PictureBox)
    l'event tick a une signature on ne peut pas la modifier

    byref ca n'a rien à faire là non plus


    Déclarer la variable Cellule1 comme Public ne me parait pas élégant
    enquoi ca serait moins élégant que le reste ?
    en private sinon, il n'y a pas de miracle si vous voulez utiliser une variable il faut bien la déclarer quelque part



    une fois de plus : lisez un cours !
    http://plasserre.developpez.com/cours/vb-net/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Je vais être un peu plus long dans mes explications
    on écrit pas ce qu'on veut dans le code
    Je suis bien conscient qu’on ne peut pas écrire ce que l’on veut dans un programme. Le code que j’ai donné sert juste à indiquer ce que j’aimerais écrire tout en sachant que ce n’est pas possible.
    une fois de plus : lisez un cours !
    C’est ce que j’ai fait mais je n’y ai pas trouvé de réponse.

    1er point : par rapport au code donné dans mon 1er message la déclaration de Metronome comme Timer est-elle correcte et au bon endroit (toujours dans le cadre de mon module avec Sub Main) ?
    Sinon faut-il la mettre à l’intérieur du Sub Main – End Sub ?

    2ème point : Metronome.Interval et Metronome.Start sont-ils correctement rédigés ? Il me semble que oui (Cours Philippe Lasserre p376)

    3ème point (le plus délicat) : la procédure liée à l’évènement devrait s’écrire (Cours Philippe Lasserre p43 – 435 – 436)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Metronome_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Metronome.Tick
    Je n’y vois pas le passage d’argument que je cherche. Peut-être est-il caché dans sender ou e mais Philippe Lasserre (toujours lui) indique
    Sender qui contient le nom de l'objet qui a déclenché l'évènement (c'est un objet)
    e un objet qui contient les arguments de cet évènement. (de type EventAgrs mais pas toujours)
    éléments liés au Timer me semble-t-il, mais pas à un autre paramètre tel que mon Picturebox

    J’ai aussi testé l’utilisation de AddHandler (p437) très prometteuse puisqu’elle renvoie sur une « routine », je peux enfin caser mon paramètre Cellule1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Metronome.Tick, AddressOf Deplace(Cellule1)
    Ce qui déclenche un message d’erreur :
    L’opérateur AdressOf doit être le nom d’une méthode (sans parenthèses)
    C’est à nouveau raté, Deplace() est une procédure , pas une méthode. Faut-il que je crée une Classe Cellules avec une méthode Deplace , que je crée ensuite l’objet Cellule1 et enfin que j'associe Metronome.Tick à Cellule1.Deplace ?

    Peut-être n’ai-je pas lu au bon endroit, peut-être y a-t-il un autre cours ? Si vous savez exactement où je peux trouver l’information que je cherche, c'est-à-dire : comment passer un paramètre à une procédure déclenchée par un Tick de Timer, merci de me l’indiquer.

    Si je dois passer par la création de la Classe Cellules pourquoi pas ! (c’est un de mes futurs objectifs). Mais avant cela je voudrais être sûr qu’il n’y a pas de procédé plus simple et que ça ne bloquera pas quand il y aura plusieurs cellules à associer à plusieurs métronomes. Le procédé qui consiste à renvoyer Metronome.Tick vers Cellule1.Deplace me semble figé et non paramétrable. Que se passera-t-il, par exemple, quand Cellule1 sera supprimé et remplacé par Cellule... ?

    Je suis impatient de vous lire.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    1er point : par rapport au code donné dans mon 1er message la déclaration de Metronome comme Timer est-elle correcte et au bon endroit (toujours dans le cadre de mon module avec Sub Main) ?
    Sinon faut-il la mettre à l’intérieur du Sub Main – End Sub ?
    c'est au choix, en dehors ca permet l'utilisation de withevents/handles qui est plus pratique que le addhandler

    Citation Envoyé par horemheb Voir le message
    3ème point (le plus délicat) : la procédure liée à l’évènement devrait s’écrire (Cours Philippe Lasserre p43 – 435 – 436)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Metronome_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Metronome.Tick
    Je n’y vois pas le passage d’argument que je cherche. Peut-être est-il caché dans sender ou e mais Philippe Lasserre (toujours lui) indique

    éléments liés au Timer me semble-t-il, mais pas à un autre paramètre tel que mon Picturebox

    J’ai aussi testé l’utilisation de AddHandler (p437) très prometteuse puisqu’elle renvoie sur une « routine », je peux enfin caser mon paramètre Cellule1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Metronome.Tick, AddressOf Deplace(Cellule1)
    Ce qui déclenche un message d’erreur
    oui donc vous écrivez sans avoir compris le cours que vous avez lu
    un évènement a une signature, typiquement sender et e dans le framework
    sender contient l'instance déclenchant l'évènement et e contient les paramètres de l'évènement
    à aucun moment vous ne pouvez rajouter de paramètres à l'évènement ou dans e, donc ne cherchez plus par là


    Citation Envoyé par horemheb Voir le message
    Si vous savez exactement où je peux trouver l’information que je cherche, c'est-à-dire : comment passer un paramètre à une procédure déclenchée par un Tick de Timer, merci de me l’indiquer.
    pas possible donc


    Citation Envoyé par horemheb Voir le message
    Si je dois passer par la création de la Classe Cellules pourquoi pas ! (c’est un de mes futurs objectifs). Mais avant cela je voudrais être sûr qu’il n’y a pas de procédé plus simple et que ça ne bloquera pas quand il y aura plusieurs cellules à associer à plusieurs métronomes. Le procédé qui consiste à renvoyer Metronome.Tick vers Cellule1.Deplace me semble figé et non paramétrable. Que se passera-t-il, par exemple, quand Cellule1 sera supprimé et remplacé par Cellule... ?
    passer par une classe c'est ce qu'il y a de mieux, et avec un timer en shared qui boucle sur les instances créées ca serait super
    par contre c'est peut etre à voir plus tard ...




    bref dans votre module
    private _pct as picturebox

    après avoir le private withevents timer as ....
    vous allez dans le combobox en haut à gauche de l'éditeur de code, vous sélectionnez le nom de votre timer, puis dans le combobox de droite vous sélectionnez l'event Tick
    ca écrit le code de la méthode, je rappelle qu'il ne sert à rien d'essayer de changer la signature (= paramètres en nombre et en types) de cette méthode ^^
    là vous avez _pct et vous pouvez le déplacer
    par contre il faut penser à mettre quelque chose dans _pct sinon ca va planter
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    oui donc vous écrivez sans avoir compris le cours que vous avez lu
    J’avoue sans honte que je ne comprends pas tout ce que je lis, je programme sans avoir assimilé les 1142 pages du cours de P Lasserre. Je maîtrise moyennement la programmation « classique » et j’ai quelques notions sur la Programmation Orientée Objet. C’est pour cela que je fais des essais qui me permettent de mieux comprendre.

    Pour avancer j’ai sorti la déclaration de Cellule1 du Sub main() pour qu’il soit accessible depuis Sub Metronome_Tick. Ce qui donne le code suivant :
    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
    Module Principal
        Private Cellule1 As New PictureBox  'création d'une picturebox
        WithEvents Metronome As New System.Windows.Forms.Timer()    'création du Timer Metronome
     
        Sub main()
            Dim Fenetre As New Form1        'création d'une fenêtre 
            Dim Temps As DateTime
     
            'initialisation cellule 1
            Fenetre.Controls.Add(Cellule1)
            With Cellule1
                .Location = New System.Drawing.Point(20, 50)
                .Size = New System.Drawing.Size(20, 20)
                .TabIndex = 0
                .Image = My.Resources.Cellule_Est
            End With
     
            'affichage initial
            Fenetre.Show()
            Cellule1.Refresh()
            System.Threading.Thread.Sleep(500) 'juste pour visualiser le début
     
            Metronome.Interval = 100    'réglage métronome
            Metronome.Start()           'départ métronome
     
            'pour passer le temps en attendant les Ticks
            Temps = DateTime.Now
            Do While DateTime.Now < Temps.AddSeconds(10)
            Loop
        End Sub
     
        Private Sub Metronome_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Metronome.Tick
            Cellule1.Left += 1
            Cellule1.Refresh()
        End Sub
    End Module
    Un test en pas à pas révèle que le code boucle sur le Do While … Loop sans être interrompu par l’évènement Metronome.Tick.
    Avec une boucle For To Next et une procédure Deplace pour remplacer Metronome_Tick ça fonctionne correctement. Ce qui me fait penser que ça vient de la gestion des Ticks, peut-être liée à ce qui suit que je n'ai pas compris.

    bref dans votre module
    private _pct as picturebox
    ...
    là vous avez _pct et vous pouvez le déplacer
    par contre il faut penser à mettre quelque chose dans _pct sinon ca va planter
    _pct De quoi s'agit-il ?
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    J’avoue sans honte que je ne comprends pas tout ce que je lis, je programme sans avoir assimilé les 1142 pages du cours de P Lasserre.
    ^^

    Citation Envoyé par horemheb Voir le message
    Je maîtrise moyennement la programmation « classique » et j’ai quelques notions sur la Programmation Orientée Objet. C’est pour cela que je fais des essais qui me permettent de mieux comprendre.
    c'est le principe en effet

    Citation Envoyé par horemheb Voir le message
    Un test en pas à pas révèle que le code boucle sur le Do While … Loop sans être interrompu par l’évènement Metronome.Tick.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Do While DateTime.Now < Temps.AddSeconds(10)
    Loop
    Alors déjà c'est interdit d'écrire ca, une boucle dans ce genre bouffe 100% des ressources processeur (ou pas loin) pendant 10 secondes
    après il y a une notion de thread là dedans, un thread c'est un peu la petite ligne jaune qui avance en pas à pas, un thread ne peut donc être qu'à un endroit à la fois
    votre appli démarre sur le thread dit "principal", tous les évènements sont mis sur une pile, puis traités chacun leur tour, vous ne sortez pas de la sub donc le thread ne peut pas dépiler les évènements
    sur une appli classique vous auriez un message "ne répond pas" de windows

    Citation Envoyé par horemheb Voir le message
    _pct De quoi s'agit-il ?
    bien que j'avais bien votre problème en tête ce n'était pas le cas pour le code
    _pct c'est votre cellule1, d'ailleurs c'est écrit ce que c'est :
    private _pct as picturebox

    donc encore quelques efforts et ca devrait aller
    par contre recommencez l'appli et faire un projet de type windows forms qui démarre sur une form
    partir sur un sub main n'a aucun sens et ca vous pourrit la vie
    quand vous aurez compris le reste vous saurez comment vous débrouiller depuis le sub main, mais là il vous bloque
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut Ca marche !!!!
    Bravo Pol63, vous m'avez mis sur la bonne voie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep(2000)
    par exemple, bloque totalement le processus
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Do While DateTime.Now < Temps.AddSeconds(10)
    accapare totalement le processus. La nuance est subtile mais aussi de taille. Je pensais que les évènements étaient malgré tout gérés et interrompaient la boucle. Ce que vous venez d'infirmer. Il fallait donc réintroduire la gestion des évènements et j'ai repensé à DoEvents() qui joue ce rôle.
    ce qui donne pour la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            'pour passer le temps en attendant les Ticks
            Temps = DateTime.Now
            Do While DateTime.Now < Temps.AddSeconds(10)
                Application.DoEvents()
            Loop
    et ça marche , ma cellule se déplace de nouveau, au rythme des Ticks.

    par contre recommencez l'appli et faire un projet de type windows forms qui démarre sur une form
    partir sur un sub main n'a aucun sens et ca vous pourrit la vie
    quand vous aurez compris le reste vous saurez comment vous débrouiller depuis le sub main, mais là il vous bloque
    Il faut croire que j'aime me pourrir la vie car je vais continuer avec mon Sub main() qui rend certes les choses plus délicates mais permet en même temps de mieux comprendre comment les éléments sont gérés. J'ai du temps et je suis très patient. Je vais pouvoir maintenant envisager de créer une classe Cellules comme je l'avais signalé plus tôt.
    Merci et à bientôt pour d'autres questions.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    DoEvents()
    ca fait parti des instruction interdites aussi ...

    vous avez le don pour trouver tout ce qu'il ne faut pas faire ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,
    Je me permets de m''immiscer dans votre conversation pour simplement pour faire une petite remarque :

    Citation Envoyé par horemheb
    Il faut croire que j'aime me pourrir la vie car je vais continuer avec mon Sub main() qui rend certes les choses plus délicates mais permet en même temps de mieux comprendre comment les éléments sont gérés
    Citation Envoyé par Pol63
    ca fait parti des instruction interdites aussi ...
    Est-ce qu'à persister dans cette voie, vous n'allez pas chercher des moyens de contournement à des problèmes que vous n'auriez pas en projet Windows Form (Simplement en ajoutant un Application.Run(LaForme) )? Je comprends votre envie de mieux comprendre comment les choses sont gérés mais à mon sens, pour résoudre vos problèmes, vous risquez d'écrire du code inutile voire pas très propre. Par exemple, gérer des controls fenêtrés en dehors de leur fenêtre propriétaire n'est pas logique et certains pourraient même dire que c'est une hérésie au sens objet du terme : Une forme est une classe et qui dit classe dit encapsulation. Donc, le Sub Main ne devrait pas "savoir" ce qui se passe sur la forme ... En plus, ça vous éviterait d'avoir à "passer le temps en attendant les Ticks"
    Et puis, rien ne vous empêche au niveau de la forme de créer dynamiquement vos controls comme vous le faites dans le Sub Main (Je pense avoir compris que vous vouliez garder la main et ne pas laisser le boulot au designer pour comprendre le fonctionnement ).
    Bon, maintenant, comme dirait l'autre, je dis ça mais je dis rien
    Bon code !
    eb.

  15. #15
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par horemheb Voir le message
    ... Mon objectif actuel (phase 2) est de déplacer "simultanément" plusieurs picturebox au moyen d'autant de timers.
    ...
    J'ai tout de même une petite question vis à vis de cette remarque.
    Si le nombre de timers est important cela ne risque-t-il pas de poser des problèmes ? (vieux souvenir de vb6, mais bon cela n'est peut-être plus vrai. Je n'ai rien trouvé sur le sujet sur le net.)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Si le nombre de timers est important cela ne risque-t-il pas de poser des problèmes ?
    même si ce la ne pose pas de problème visible, vu qu'on peut le faire avec un seul ca ne sert à rien d'en utiliser plusieurs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Vos remarques remettent en question ma façon de concevoir un programme orienté objet. J'en suis encore à la méthode du Basic des années 70 c'est à dire un programme principal qui gère tout. Pour moi une Classe est "juste" un moyen de créer des objets avec quelques facilités de manipulation(méthodes, propriétés).
    Pour reprendre l'exemple de l'auto. Pour moi la Classe est l'usine qui sert à concevoir un modèle de voiture et à la fabriquer à la demande du client. Le client se sert ensuite du véhicule à l'extérieur de l'usine. J'ai l'impression que vous me proposez d'utiliser le véhicule à l'intérieur de l'usine, ce que je n'arrive pas à concevoir.
    D'autre part si l'on gère simultanément plusieurs fenêtres, où se positionne-t-on pour gérer leur fonctionnement ? Si c'est pour le définir à l'intérieur d'une classe, ça revient à créer un module externe sans le dire et les problèmes restent les mêmes.

    J'ai de grosses difficultés à assimiler toutes les implications de ce type de programmation (l'âge peut-être?).

    Pour revenir à des aspects plus concrets, pourquoi DoEvents() est interdit ?

    Concernant les Timers, je vais préciser plus en détail ce que je souhaite réaliser.
    Dans une 1ère fenêtre vont se créer, se déplacer puis disparaître des "cellules".
    Chacune va laisser une "trace" de son déplacement dans une matrice associée aux pixels d'une 2ème fenêtre.
    Les 2 fenêtres se superposent, la 1ère est transparente.
    Les cellules ne se déplacent pas à la même vitesse, les déplacements sont plus ou moins aléatoires.

    Comment je procède actuellement (une seule cellule):
    Je déplace une PictureBox dans la fenêtre du dessus, ce qui évite de remettre à jour l'endroit où elle se situait précédemment. Parallèlement j'utilise un Pen pour effectuer la trace dans la 2ème fenêtre.
    J'associe ses déplacements aux Ticks d'un timer. J'en suis là.

    Pour gérer plusieurs cellules (10 maxi) j'ai imaginé la technique suivante :
    chaque timer aura un Interval différent, donc au travers du Sender du timer il est possible de savoir à quel timer le Tick correspond. d'autre part lorsque l'on instancie plusieurs objets (ici les cellules) elles sont associées à un numéro dans une liste. Il reste ensuite à associer la cellule 1 à l'interval=201 (par exemple), la cellule 2 à l'interval=202, etc, ce qui permettra des déplacements désynchronisés et de résoudre les problèmes de timer liés à la création et disparition des cellules (suis-je clair ???).

    Ca revient à réaliser un jeu avec les déplacements d'individus, véhicules ou autres, devant gérer leur environnement (terrain, adversaires, agressions). Ce projet n'a aucun impératif professionnel, il me sert à essayer de comprendre ce type de programmation, pour satisfaire ma curiosité.

    Accessoirement il me permet (étant enseignant) de comprendre les difficultés que l'on rencontre pour comprendre un concept nouveau et, par rebond, comment le faire comprendre.

    J'espère ne pas vous avoir soûlé avec ma prose.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  18. #18
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    même si ce la ne pose pas de problème visible,
    Ma question était générale pour le nombre de timer

    Citation Envoyé par Pol63 Voir le message
    vu qu'on peut le faire avec un seul ca ne sert à rien d'en utiliser plusieurs
    Bien sur, puisqu'il suffit pour chaque PictureBox de jouer sur le nombre de déclenchement du timer et/ou la nouvelle position avant de procéder au déplacement.

    Merci pour ta réponse.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    J'en suis encore à la méthode du Basic des années 70 c'est à dire un programme principal qui gère tout. Pour moi une Classe est "juste" un moyen de créer des objets avec quelques facilités de manipulation(méthodes, propriétés).
    en effet ca a bien changé, et en wpf (qui n'est pourtant en théorie qu'un changement d'interface graphique du .net) c'est encore différent au niveau de la gestion du code


    Citation Envoyé par horemheb Voir le message
    Pour reprendre l'exemple de l'auto
    l'exemple de l'auto qui a une propriété couleur, ou du chien qui a une méthode "aboyer" n'a jamais été capable d'expliquer quelque chose

    exemple concret, avec un boitier relié en usb au pc avec lequel tu peux recevoir la température des pièces de ta maison, et allumer des radiateurs ou non
    tu peux tout coder dans le form qui affiche ta maison, comme on aurait fait sous vb6 mais ce n'est pas la seule voie, ni la meilleure
    il faut donc une classe pièce, avec des propriétés de taille et autres, une ou plusieurs instances de capteur température, et une ou plusieurs instances de radiateur
    le form qui affiche la pièce à l'écran n'a aucune raison de savoir comment on dialogue avec le module usb, ce n'est pas lui de faire un timer pour vérifier toutes les 30 secondes la température
    la classe capteur par contre elle implémente tout ce qu'il faut pour dialoguer avec l'usb, sur un autre thread que le principal tant qu'à faire
    la classe capteur n'a pas à savoir non plus qu'elle est là pour une pièce comme ca elle peut etre réutilisée plus tard dans une chambre froide ou autre, ou avec un type de capteur dont le dialogue est en ethernet, elle ne sait que demander au module tous les tant de temps quelle température il fait pour stocker la valeur (ou le défaut de communication) dans une propriété
    la pièce elle peut demander la température directement à l'instance de classe capteur, et si elle a une température de prévue peut demander au radiateur de se mettre en route
    là aussi elle n'a pas à connaitre la classe radiateur, car un radiateur peut se commander de telle manière ou de telle autre
    et encore moins le form n'a à connaitre les octets qu'il faut envoyer au module usb pour allumer le radiateur, éventuellement elle n'a même pas à connaitre ce qu'elle affiche (plus orienté wpf)
    et là la POO prend tout son sens car on peut alors faire une interface ICapteur ou une classe abstraire Capteur avec de l'héritage (le choix d'une interface ou d'une classe abstraite et un autre débat, qui dépend de ce qu'on en fait ensuite)
    comme ca 2 jours après si tu as besoin d'utiliser un capteur d’hygrométrie tu as peu de code à faire et tout marche pareil
    car la POO n'est pas une fin mais un moyen, le but d'un langage de haut niveau tel .net est que le développeur ait peu de code à écrire/tester/maintenir dans sa carrière (et donc un temps d'écriture d'un programme réduit)

    après il faudrait connaitre ton métier pour trouver un exemple qui te parle, j'aurais pu aussi te parler de fiche de paye et de rubrique de paye ou tout se base sur brut / tranche A/B/C, une rubrique n'ayant pas à savoir ce qu'elle est mais juste comment elle se calcule à partir de ces éléments, le form n'ayant là pas à savoir comment se calcul le net ni si le salarié a une mutuelle, il demande à la fiche de paye le net et les strings à afficher à chaque ligne, et la fiche de paye fait un for each sur une collection qui peut contenir plein de choses différentes mais qui répondent à une même logique, calculer la somme (positive ou négative) à partir de peu d'éléments




    Citation Envoyé par horemheb Voir le message
    Pour revenir à des aspects plus concrets, pourquoi DoEvents() est interdit ?
    DoEvents est une bidouille pratique
    dans les faits, comme dit précédemment les évènements sont mis sur une pile chaque sub liée à un évènement sera alors appelée. doevents interrompt l'exécution du code actuel pour dépiler les évènements (s'il y en a) puis revient dans la méthode appelant le doevents pour passer à la ligne d'après
    en théorie ca montre donc un soucis de code qui est trop long à exécuter et qui n'a rien à faire sur ce thread, en pratique ca peut provoquer des disfonctionnements, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    doevents
    me.button1.text = "test"
    si pendant le doevents on clique sur un bouton qui ferme la fenetre (via un dispose certes) après ca revient sur me.button1.text or button1 n'existe plus => plantage
    sous vb6 doevents menait les 3/4 du temps à une instabilité aléatoire
    sous .net avec une meilleure gestion d'erreur ca peut ne pas se voir mais ca reste très limite
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    il faut donc une classe pièce, …, une ou plusieurs instances de capteur température, et une ou plusieurs instances de radiateur.
    la classe capteur par contre elle implémente tout ce qu'il faut pour dialoguer avec l'usb, sur un autre thread que le principal tant qu'à faire
    Le dire c’est bien, le faire quand on n’a aucune pratique c’est nettement plus difficile. Je conçois à peu près ce que ça signifie, mais, quant à sa mise en
    œuvre… Je bloque sur beaucoup de détails qui peuvent paraître anodins, à la fois sur l’architecture du projet et sur des points de code.

    Je suis en train d'essayer de restructurer mon projet dans ce sens. Je vais mettre une autre discussion sur le forum concernant les Constructeurs et l’utilisation de New pour créer une instance d’objet.

    Reprenons la problématique du DoEvents.
    Un évèment tel que un Timer_Tick doit interrompre l’exécution du code en cours. Or il n’a aucun effet sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'pour passer le temps en attendant les Ticks
            Temps = DateTime.Now
            Do While DateTime.Now < Temps.AddSeconds(10)
            Loop
    Vous m’expliquez que
    après il y a une notion de thread là dedans, un thread c'est un peu la petite ligne jaune qui avance en pas à pas, un thread ne peut donc être qu'à un endroit à la fois
    votre appli démarre sur le thread dit "principal", tous les évènements sont mis sur une pile, puis traités chacun leur tour, vous ne sortez pas de la sub donc le thread ne peut pas dépiler les évènements
    S’il y a un long processus de traitement dans la sub, comment fait-on alors pour l’interrompre ? Qu’en est-il pour une suite de sub imbriquées ? Quand les évènements peuvent-ils s’exécuter ?
    Vous dites aussi
    doevents interrompt l'exécution du code actuel pour dépiler les évènements
    Je pensais que le principe d’un évènement est d’interrompre le processus en cours, quel qu’il soit, pour exécuter le code associé à l’évènement.
    Je m'y perds
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 11h01
  2. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44
  4. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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