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 :

Sub non bloquante


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut Sub non bloquante
    Bonjour,

    J'ai une question un peu bête, mais mon programme arrive au bout et un nouvel élément est apparus.

    Je fonctionne avec une base de données et des fichiers .csv que je dois traiter et inclure dans la base. La seconde partie du logiciel sert à la modification et à la consultation de la base.

    Je souhaitais faire en sorte que l'importation des données depuis les CSV ne bloque pas l'application et j'ai utilisé pour cela un backgroundworker. Ca fonctionne très bien sauf qu'au final, la double connection à la base (une pour l'injection des données et l'autre pour la consultation) fait planté le programme.

    J'ai donc fait machine arrière pour supprimer le BGW afin que l'utilisateur ne soit pas embéter (ou tenter de faire des bétises).

    Hors il se trouve que mon appel de fonction (code ci-dessous) a exactement le même résultat que le BGW mais sans le plantage des deux connections en simultanées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub btnImportation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportationDiff.Click
            Call ImportationDonnees()
        End Sub
    Au final, je ne comprend pas bien le pourquoi du comment sachant que je n'avais jamais fait attention si le logiciel se figeait ou non.

    Est-ce que quelqu'un en sait plus là dessus ? Et du coup, si c'est normal, quel est l’intérêt des BGW ?

    Merci d'avance
    Cordialement

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour prologic,

    Ta sub ImportationDonnees est peut-être assez rapide pour que tu ne te rende pas compte qu'elle bloque l'interface. Mais je te garanti qu'elle la bloque...

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Elle tourne pendant une dizaine de minute et pendant ce temps là je peux interagir avec le reste du programme.

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Tu es sûr de ne pas avoir mis de BackGroundWorker autre part ou un Application.DoEvent dans une boucle de ta sub ImportationDonnees (chose à ne pas faire)

    Si tu veux être sûr de ton déroulement. Met ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Sub btnImportation_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportationDiff.Click
            Debug.WriteLine("Avant Import")
            Call ImportationDonnees()
            Debug.WriteLine("Après Import")
        End Sub
        private Sub ImportationDonnees()
             Debug.WriteLine("Début Import")
             '...
             Debug.WriteLine("Fin Import")
        End Sub
    et regarde les messages dans ta console

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Ha si, j'ai des Application.DoEvent pour incrémenter ma progressbar.

    Ceci explique peut-être cela...

    Comment puis-je incrémenté ma PB sans le DoEvent ?

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Ceci explique cela en effet

    Pour te débarrasser de cela, la solution est de passer par un BackGroundWorker et son événement ReportProgress.

    Es-tu sûr que se soit la double connexion qui plante dans ton ancien BackGroundWorker et pas l'accès à ta progressBar qui est interdite dans la fonction doWork du BackGroundWorker (autre thread)?

    Pour bien comprendre le BackGroundWorker je te conseil ces articles/codes :

  7. #7
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir Prologic,

    L'incrémentation de la PGBar ne se fait pas dans un DoEvents mais dans un Event ProgressChanged lié au BGW.

    Force est de constater que la moitié des gens qui utilisent 1 BGW ne savent pas s'en servir correctement avec les 3 events :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    'SETTINGS YOUR BGW TO SUPPORT CANCELLATION AND REPORTPROGRESS EVENTS
    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.WorkerSupportsCancellation = True
     
     
      Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
     
    'DOING WHAT EVER YOU WANT ESPECIALLY LONG CALCULATING PROCESS 
    '.......
    '.........
    '............
     
    'UPDATE THE UI WHEREVER YOU WANT IN THIS "DoWork Event" (PGBAR OR LISTVIEW....AND SO ON.....)
    Me.BackgroundWorker1.ReportProgress(INTEGER_ARG_TO_UPDATE_PGBAR_: _GET_IT_IN_ProgressChanged_Event, "ANOTHER_ARG_WITH_TYPE_OF_YOUR_CHOICE_:_GET_IT_IN_ProgressChanged_Event")
     
    '.....
    '........UPDATING UI ....ANOTHER TIME
    '......
    '.........
     
        End Sub
     
        Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
     
    'RETRIEVE ARGS BEEN PASSED FROM "DoWork Event"
     
    'e.ProgressPercentage
    'e.UserState
     
        End Sub
     
        Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
     
    ' MANAGE THE COMPLETED EVENT WORK WITH 2 args
     
    'e.error
    'e.cancelled
     
        End Sub

    Si toutefois ton interface reste toujours figée alors à ce moment tu dois utiliser 1 délégué pour mettre à jour ta partie UI.

    A+

  8. #8
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Voir cette source que j'ai postée montrant l'utilisation du BGW pour faire avancer une ProgressBar
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  9. #9
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    @Infosam : Très belle source au passage avec tout le nécessaire pour une bonne utilisation (Les events, cancellation et Progress Support, Completed error ou cancelled,...etc...)


    --> Je rajouterais également ceci :

    Pour éviter le lancement du BGW s'il est déjà en cours de traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Not BGW.isBusy then
        Me.BGW.RunWorkerAsync()
    End If
    A+

  10. #10
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    @infosam : La source avait été donnée dans mon 3iem lien.

  11. #11
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    @infosam : La source avait été donnée dans mon 3iem lien
    Autant pour moi j'avais zappé ce lien (oui c'est un des miens )

    @Infosam : Très belle source au passage avec tout le nécessaire pour une bonne utilisation (Les events, cancellation et Progress Support, Completed error ou cancelled,...etc...)


    --> Je rajouterais également ceci :

    Pour éviter le lancement du BGW s'il est déjà en cours de traitement :
    Merci bien et +1 pour le test pour voir le BGW tourne déjà.
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  12. #12
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    L'incrémentation de la PGBar ne se fait pas dans un DoEvents mais dans un Event ProgressChanged lié au BGW.
    En fait, le DoEvents est dans une Sub classique et non dans un BGW. Et je l'utilisais pour mettre à jour des TextBox. La progressbar défile correctement dans la Sub même bloquante sans les DoEvents.

    Citation Envoyé par Sankasssss Voir le message
    Es-tu sûr que se soit la double connexion qui plante dans ton ancien BackGroundWorker et pas l'accès à ta progressBar qui est interdite dans la fonction doWork du BackGroundWorker (autre thread)?
    Je penses que oui, c'est lié à une double ouverture de connexion sans fermeture ou inversement, une demande fermeture sans ouverture préalable...

    Pour le moment la solution de fonctionne en BGW n'est pas très importante, c'était un plus, surtout pour le jour où l'importation pourrait durer plusieurs heures, mais là on ne dépasse pas les 10min donc le gars ira prendre un café.

    Je garde la source du BGW, je penses que ca me sera très utile dans quelques mois.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/10/2005, 12h29
  2. Réponses: 5
    Dernier message: 02/09/2005, 12h47
  3. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  4. Réponses: 3
    Dernier message: 16/03/2004, 16h42
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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