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 :

Boucle en parallèle de l'exécution du code


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut Boucle en parallèle de l'exécution du code
    Bonjour, voilà mon petit problème :

    J'ai une form1, et pour valider les infos dans ma form et génerer un rapport, je clique sur un bouton, le bouton générer comme sur la photo ci-dessous :



    Une fois que je clique sur mon bouton générer, la form1 se ferme et une form2 apparaît, avec une picturebox comportant une image.gif, qui est censé être animée. Cette form2 est une form "d'attente", qui est censé être affiché pendant la génération du tableau de bord, comme l'image ci-dessous :

    Attention il ne s'agit pas d'une progressbar malgrès le nom de la form2



    Et donc pendant que cette form est affichée, derrière je veux que mon code s'éxécute, et quand il a fini, ma form2 se ferme et uen form3 affiche mon tableau d ebord. Aucun souci à ce niveau là cela fonctionne, mais le seul problème c'est qu'il faut "chainrefresh" la form2 ou la picturebox de la form2 contenant l'image.gif, pour que le mouvement s'effectue, c'est là que vient mon problème.

    J'ai essayé avec du doevent, ou du while mais ce n'est pas adapté.

    Voici le code de mon bouton "générer" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Public Sub Btgenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btgenerer.Click
     
            Dim msg, title As String
            Dim style As MsgBoxStyle
            Dim response As MsgBoxResult
     
            'Si aucune date n'a été rentrée, on ne peut continuer, messagebox d'erreur
            If Txtboxcal.Text = "" Then
     
                msg = "Vous n'avez pas sélectionné la date à considérée."   ' définit le message
                style = MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly Or MsgBoxStyle.SystemModal 'définit le style
                title = "Erreur"   ' définit le titre
                response = MsgBox(msg, style, title)
                GoTo toto
     
            End If
     
            'Gestion de l'affichage
            Me.Hide()
            Menu_principal.Refresh()
            Progressbar.pict1.Size = New Size(69, 66) '30,30
            Progressbar.pict1.Location = New Point(100, 70) '83 height
            Progressbar.pict1.Image = My.Resources.testbis
            Progressbar.Label2.Text = "Génération en cours"
            Progressbar.Text = "Génération du tableau de bord"
            Progressbar.Show()
            Progressbar.refresh()
     
     
            'Copie des rapports dans des tables
            Call CopieRapports()
     
            'Cherche les positions des balises début, fin et absence dans le tableau contenant
            'le rapport
            Call RechercheBalises()
     
            'Extraction 1
            Call sub1()
            Call sub2()
            Call sub3()
            Call sub4()
            Call sub5()
            Call sub6()
            Call sub7()
     
            'Extraction 2
            Call ExtractionActivity()
            Call ExtractionTaskMean()
            Call ExtractionMean()
            Call CreateTableWeek()
            Call UpdateTableActivity()
            Call CreateTM()
            Call BudgetConsomé()
            Call BudgetSemaine()
     
     
            'Génération du Tableau de bord
            Call Menu_principal.Datagrid1Load()
            Call Menu_principal.treeview(Menu_principal.Datagrid1, TableActivity, "+", My.Resources.pluss)
            Call Menu_principal.graphbar()
            Call Menu_principal.Datagrid2Load()
            Call Menu_principal.Datagrid3Load()
            Call Menu_principal.Datagrid4Load()
     
     
            'Lancement de la phase Calcul
            Call Calc_affich_nb_os_chef_total()
            Call Calc_affich_fourn_sstait_total()
            Call Calcul_affich_nb_materiel_total()
            Call Feuxetcouleurs()
     
            'On ferme la progressbar
            Progressbar.Hide()
     
    toto:
     
        End Sub
    En gros moi je veux un truc du genre :

    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
          'Gestion de l'affichage
            Me.Hide()
            Menu_principal.Refresh()
            Progressbar.pict1.Size = New Size(69, 66) '30,30
            Progressbar.pict1.Location = New Point(100, 70) '83 height
            Progressbar.pict1.Image = My.Resources.testbis
            Progressbar.Label2.Text = "Génération en cours"
            Progressbar.Text = "Génération du tableau de bord"
            Progressbar.Show()
            Progressbar.refresh()
     
            'Tant que ma form2 est ouverte, refresh ma form2.pict1
            While Progressbar.visible = true
     
            Progressbar.pict1.refresh
     
            End While
     
            'On execécute tous mes sub
            Call mysubs()
     
            'On ferme la progressbar
            Progressbar.Hide()
    OU encore :

    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
           'Tant que ma form2 est ouverte, refresh ma form2
     
            dim x as integer = 1
            While x = 1
     
            Progressbar.pict1.refresh
     
            End While
     
            'On execécute tous mes sub
            Call mysubs()
     
            'Fin de ma boucle
            x = 2
     
            'On ferme la progressbar
            Progressbar.Hide()
    Je sais bien que en faisant une boucle while comme je l'ai faite, ma boucle est infinie, donc y a-t-il moyen de lancer une boucle, puis que le sub continue d'exécuter le code situé après, et que quand il rencontre une condition définie dans ma boucle, il arrête la boucle.

    Il faut sans doute recoller le Call mysubs() dans la boucle while avec un doevents et ma condition après le Call mysubs() ?

    J'espère m'être fait comprendre, merci de vos réponses.

  2. #2
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Bonjour,

    Tu peux utiliser un BackgroundWorker afin que la génération du tableau de bord se fasse en arrière plan.

    Dans l'évènement DoWork du BackgroundWorker, tu mets le génération de ton tableau et du gère dans une Sub le refresh de ta form2.

  3. #3
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Bon voila ce que j'ai fait :

    J'ai créé un backgroundworker via le design, puis j'ai modifié mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
        Public Sub Btgenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btgenerer.Click
     
            Dim msg, title As String
            Dim style As MsgBoxStyle
            Dim response As MsgBoxResult
     
            'Si aucune date n'a été rentrée, on ne peut continuer, messagebox d'erreur
            If Txtboxcal.Text = "" Then
     
                msg = "Vous n'avez pas sélectionné la date à considérée."   ' définit le message
                style = MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly Or MsgBoxStyle.SystemModal 'définit le style
                title = "Erreur"   ' définit le titre
                response = MsgBox(msg, style, title)
                GoTo toto
     
            End If
     
            'Gestion de l'affichage
            Me.Hide()
            Menu_principal.Refresh()
            Progressbar.pict1.Size = New Size(69, 66) '30,30
            Progressbar.pict1.Location = New Point(100, 70) '83 height
            Progressbar.pict1.Image = My.Resources.testbis
            Progressbar.Label2.Text = "Génération en cours"
            Progressbar.Text = "génération du tableau de bord en cours"
            Progressbar.Show()
     
            BackgroundWorker1.RunWorkerAsync()
     
            Do While x <> "fini"
     
                Progressbar.Refresh()
     
            Loop
     
            'On ferme la progressbar
            Progressbar.Hide()
     
    toto:
     
        End Sub
    Ensuite j'ai créé les évènements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
     
            Call Mysubs()  '(j'ai coupé tous mes subs ici)
     
        End Sub
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
     
            x = "fini"
     
        End Sub
    Mais ca ne fonctionne pas. En mettant un point d'arrêt au niveau du

    je vois qu'il n'y passe pas.

    A priori il y a un paramètre à rentrer (ou pas) quand on déclenche BackgroundWorker1.RunWorkerAsync(), mais bon je vois pas quoi, vu que je n'ai pas idée du temps que cela va prendre.

  4. #4
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Ok, en fait si il rentre bien dans mon le doworker, et commence à me call mes différents sub, le seul souci c'est que le temps d'exécution de mon plus long sub est devenu extrèmement long.

    Une solution ?

  5. #5
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Si Call Mysubs() ne s'exécute pas, c'est que ta fonction manipule les contrôles de l'interface utilisateur, or ceci est interdit pour ce contrôle.

  6. #6
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Pour ton progressbar, utilise l'évènement progresschanged du backgroundworker. Regarge cette page:http://glarde.developpez.com/dotnet/bgworker/vb/
    Ainsi, tu gère dans le progresschanged l'état d'avancement du DoWork

  7. #7
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    En fait si il commence bien à exécuter les différents sub(), seulement certains sub ont l'air de ne jamais se finir de s'exécuter.

    Dans mes subs tous ce que je fais ce sont des requettes SQL sur des datatables (remplissage et opérations).

    Je récupère également des valeurs dans des datagridview (est-ce considéré comme de la manipulation de contrôles ?).

    Ou encore l'ajout de valeur dans une cellule d'un datagridview ?

  8. #8
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Je n'ai aucune progressbar, juste une image en .gif qui tourne durant l'opération, donc je n'ai pas besoin de l'opération progresschanged.

  9. #9
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    DataGridView est un contrôle. Certaines valeurs de ce contrôles sont susceptible d'être changer ou de l'avoir été.

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

Discussions similaires

  1. Exécuter une boucle en parallèle
    Par Swaraj dans le forum Général Python
    Réponses: 11
    Dernier message: 06/12/2011, 03h53
  2. Réponses: 44
    Dernier message: 02/08/2006, 16h12
  3. [RosASM] Tracer l'exécution du code
    Par aumeunier dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 14/03/2006, 18h26
  4. Réponses: 3
    Dernier message: 20/04/2005, 12h30
  5. Réponses: 7
    Dernier message: 03/02/2005, 17h20

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