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

 .NET Discussion :

DoEvents ou Thread? Ceci est la question.


Sujet :

.NET

  1. #1
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut DoEvents ou Thread? Ceci est la question.
    Bonjour à tous.

    Je développe un application dans la quelle à un moment donné je doit sauvegarder des données dans une base SQL. Jusqu'ici tout va bien.

    Pendant que je sauvegarde j'affiche un petit label en plein milieu de l'écran pour avertir les utilisateur qu'un traitement est en cour.

    Mon label est tout simple, couleur de fond de base, simple contour noir, écrit en Noir Gras. Je l'affiche au tout début de ma fonction de sauvegarde ... et le cache à la fin. Il est créé sur ma forme et est invisible par défaut.

    Seulement voila, le traitement derrière est lourd et du coup si je n'utilise pas DoEvents ... le label n'affiche que son contour

    Cependant j'ai lus que DoEvents était du passé et que maintenant il y avait les thread ... et que ceux-ci permettait de passer outre DoEvents.

    Comme j'aime faire les choses bien proprement, je me demandais donc si utiliser des thread pour un simple label ne serai pas un peu lourd...voir inutile.

    Je viens donc vous demander vos avis éclairés

    D'avance merci.
    Rien n'est rien!!! ... Tout est quelque chose!!!

    Petits liens utiles :
    -Chaine de connexion : http://www.connectionstrings.com/
    -ADO et ADO.net : Tuto ADO et ADO.net

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    En théorie, DoEvent c'est le mal incarné
    mais en pratique, pour des cas simples, pourquoi pas.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Tiens d'ailleurs ta remarque me fait penser à une question :
    -Pourquoi DoEvents est-il le mal incarné?

    En tout cas merci de ta réponse même si elle ne répond pas entièrement à ma question
    Rien n'est rien!!! ... Tout est quelque chose!!!

    Petits liens utiles :
    -Chaine de connexion : http://www.connectionstrings.com/
    -ADO et ADO.net : Tuto ADO et ADO.net

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    En gros DoEvent suspend le thread, mais continue de traiter les messages Windows. Et si un de ces message déclenche un événement dans ton appli, tu peux te retrouver dans un état instable. Voila pourquoi MS déconseille son utilisation.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  5. #5
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Je te remercie pour ton explication.
    Je ne savais pas comment il fonctionnait et je croyais qu'il bloquait toutes nouvelles instructions jusqu'à ce que celles en cours sois finies.
    Mais en vus de ton explication je comprend le risque de l'utiliser.

    Merci à toi.
    Rien n'est rien!!! ... Tout est quelque chose!!!

    Petits liens utiles :
    -Chaine de connexion : http://www.connectionstrings.com/
    -ADO et ADO.net : Tuto ADO et ADO.net

  6. #6
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    De rien! Maintenant, si c'est une appli perso pas trop complexe, je l'ai déjà utilisé par facilité. Mais dans un environnement pro complexe, j'éviterais.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    je me demandais donc si utiliser des thread pour un simple label ne serai pas un peu lourd...voir inutile.
    Dans ce cas, même si le DoEvents() est comme l'indiquait GurruuMeditation plus simple (mais moins "safe"), la solution appropriée est un BackGroundWorker.
    voir : http://webman.developpez.com/article...ckroundworker/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Bonjour à tous et surtout merci pour vos réponses.

    Du coup je me suis renseigné sur les thread pour comprendre comment fonctionnaient les BackGroundWorker (j'aime comprendre ... ou au moins essayer )

    Et du coup je suis tombé sur les Delegate (queje connaissais sous le nom de "Hook" jusqu'à maintenant )

    Suite à ça j'ai fait quelques tests sans utiliser les BackGroundWorker ... et en fin de compte le simple fait d'utiliser un Delegate pour appeler ma fonction de refresh de mon Label et de la progres bar qui va avec ... et ça fonctionne.

    Voici le code en gros :

    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
    'Déclaration du Delegate dans ma classe (ne fonctionne pas en local apparement)
    Public Delegate Sub Hook_PGB_Update(ByVal Valeur As Integer)
     
    ...
    Private Sub Test (ByRef FormM as Form_Main, ByRef FormL as Form_Load)
    'Form_Main est mon formulaire principal
    'Form_Load est le formulaire qui contient mon Label et ma progresse bar
     
            'Déclare la variable qui permettra d'utiliser le Delegate pour appeler la fonction
            Dim HK As Hook_PGB_Update = (AddressOf FormL.PGB_Update)
     
            'Défini la valeur du progresse bar
            HK.Invoke(20) 'Fonctionne bien, les controle du form_Load sont bien affichés
            FormL.PGB_UpDate(20) 'Les controls ne sont pas affichés correctement
     
    ...
     
    End Sub
     
    'La fonction sur mon autre formulaire
    Public Sub PGB_Update(ByVal Valeur As Integer)
            'Controle le paramètre de valeur de la progresse bar
            If Valeur > 100 Then Valeur = 100
            If Valeur < 0 Then Valeur = 0
            'Met à jour la progresse bar avec la nouvelle valeur
            Me.PGB_Save.Value = Valeur 
            Me.PGB_Save.Refresh()
            ' Refresh le Label
            Me.LB_Enregistrement.Refresh()
    End Sub
    J'avoue ne pas bien comprendre pourquoi ça fonctionne avec le Delegate et pas si j'appelle en direct.
    Je pense que c'est par-ce que quand j'appelle en direct, le calcul de l'affichage des controls ce fait dans le thread de mon formulaire principal ... qui est ensuite "bloqué" par le lourd traitement derrière.

    Alors qu'avec le Delegate, ça calcul l'affichage dans le Thread du Form_Load qui lui est libre à la fin de la fonction.

    Mais je suis pas sur. Si quelqu'un pouvait me confirmer/Infirmer ma théorie ce serai super.

    En tout cas merci de votre aide.
    Rien n'est rien!!! ... Tout est quelque chose!!!

    Petits liens utiles :
    -Chaine de connexion : http://www.connectionstrings.com/
    -ADO et ADO.net : Tuto ADO et ADO.net

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut DoEvents est une solution toute simple mais tu ne contrôles pas la synchronisation des processus.
    Donc effectivement un thread est peut-être plus approprié

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    La piste du BackgroundWorker est la plus simple je pense, car très facile à mettre en place (bien plus que du multi-threading classique), et tu pourras même remplacer ton message par une belle progressbar toute belle

    Quant à DoEvents, faut laisser ça à VB6, comme le GOTO au Basic
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/11/2006, 12h36
  2. [Thread]Savoir si un thread s'est bien terminé.
    Par thibaut dans le forum Général Java
    Réponses: 16
    Dernier message: 27/09/2006, 17h30
  3. threads pas Thread ! (1 tte tite question)
    Par lagra3 dans le forum Langage
    Réponses: 3
    Dernier message: 11/08/2006, 12h28
  4. Réponses: 1
    Dernier message: 27/11/2005, 21h45

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