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

C# Discussion :

Winform : Parallelisme => Interaction avec les composants graphiques


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Winform : Parallelisme => Interaction avec les composants graphiques
    Bonjour @ tous,

    Je me met au parallélisme, et j'ai un traitement en winform qui charge des feuilles Excel dans des Hashtable.
    L'opération se fait plusieurs fois, j'ai donc décidé d'utiliser le parallélisme.
    Du coup, il me faut une progressBar par traitement. J'ai donc décidé (pour tester) de les empiler dans un composant texte qui prends une bonne partie de mon interface.
    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
                Hashtable htUd = null;
                Hashtable htCpm = null;
                Hashtable htItem = null;
                Hashtable htSpm = null;
                Hashtable htSol = null;
                Hashtable htEIPC = null;
                Hashtable htSbA = null;
                Hashtable htSbB = null;
                Parallel.Invoke(
                    () => { htUd = GetListe(txtFicXlsUd.Text, txtXlsFllUd.Text, txtXlsRefUD.Text, txtXlsLibUD.Text, txtXlsLn1UD.Text, "Lecture de la liste 1"); },
                    () => { htCpm = GetListe(txtFicXlsCPM.Text, txtXlsFllCPM.Text, txtXlsRefCPM.Text, txtXlsLibCPM.Text, txtXlsLn1CPM.Text, "Lecture de la liste 2"); },
                    () => { htItem = GetListe(txtFicXlsITEM.Text, txtXlsFllITEM.Text, txtXlsRefITEM.Text, txtXlsLibITEM.Text, txtXlsLn1ITEM.Text, "Lecture de la liste 3"); },
                    () => { htSpm = GetListe(txtFicXlsSPM.Text, txtXlsFllSPM.Text, txtXlsRefSPM.Text, txtXlsLibSPM.Text, txtXlsLn1SPM.Text, "Lecture de la liste des 4"); },
                    () => { htSol = GetListe(txtFicXlsSOL.Text, txtXlsFllSOL.Text, txtXlsRefSOL.Text, txtXlsLibSOL.Text, txtXlsLn1SOL.Text, "Lecture de la liste des 5"); },
                    () => { htEIPC = GetListe(txtFicXlsEIPCA.Text, txtXlsFllEIPCA.Text, txtXlsRefEIPCA.Text, txtXlsLibEIPCA.Text, txtXlsLn1EIPCA.Text, "Lecture de la liste 6"); },
                    () => { htSbA = GetListe(txtFicXlsSBA.Text, txtXlsFllSBA.Text, txtXlsRefSBA.Text, txtXlsLibSBA.Text, txtXlsLn1SBA.Text, "Lecture de la liste des 7"); },
                    () => { htSbB = GetListe(txtFicXlsSBB.Text, txtXlsFllSBB.Text, txtXlsRefSBB.Text, txtXlsLibSBB.Text, txtXlsLn1SBB.Text, "Lecture de la liste des 8"); }
                ); // */
     
            private Hashtable GetListe(string ficXls, string xlsFeuille, string xlsColId, string xlsColLib, string xlsLigne1, string texte, string regexId="") {
                Hashtable ret = new Hashtable();
                int tmp = 0;
                if (!string.IsNullOrEmpty(ficXls.Trim()) && (File.Exists(ficXls)) && (int.TryParse(xlsLigne1, out tmp))) {
                    UtilsExcel ue = new UtilsExcel();
                    tssLabel.Text = texte;
                    ProgressBar pb = new ProgressBar();
                    pb.Name = Guid.NewGuid().ToString();
                    if (txtInfos.InvokeRequired) { // Gérer les accès concurentiels.
                        txtInfos.Invoke(new AddControl(CtlAddControl), txtInfos, pb);
                    } else
                        pb.Parent = txtInfos;
                    Application.DoEvents();
                    pb.Dock = DockStyle.Top;
                    pb.BringToFront(); // */
                    ret = ue.GetListe(ficXls, xlsFeuille, xlsColId, xlsColLib, tmp, ref pb, regexId); //tssPbMain
                    pb.Dispose();
                    if (string.IsNullOrEmpty(ue.msgErr)) {
                        txtInfos.Text += "OK. " + tssLabel.Text + ". " + ret.Count + " éléments intégrés." + Environment.NewLine + ue.msgInfo;
                    } else
                        txtInfos.Text += "KO. " + tssLabel.Text + ". " + ue.msgErr + Environment.NewLine;
                } // */
                return ret;
            }
     
            private delegate void AddControl(Control ctlParent, Control ctlEnfant); // Modèle de fonction (prototype) pour l'instanciation.
            private static void CtlAddControl(Control ctlParent, Control ctlEnfant) {
                Application.DoEvents();
                ctlEnfant.Parent = ctlParent;
            }
    Seulement, ça ne fonctionne pas (si je suis en synchrone, ça fonctionne).
    Les progressbar n'apparaissent pas... Je ne vois même pas Excel se lancer.

    Qu'est ce que je n'ai pas fait comme il faut ?

    [EDIT] : En fait, il fait bien toutes les actions, mais il doit bloquer quelque part car je vois tous les libellés passer, mais le traitement ne se termine jamais.

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Le souci principal est que Parallel.Invoke est un appel bloquant/synchrone qui ne revient que quand toutes les tâches sont finies.
    Donc tu bloques ton thread UI qui ne peut plus traiter les autres évènements dont ceux de repaint.
    C'est pourquoi tu es obligé de bidouiller avec Application.DoEvents.

    Quick-and-dirty fix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Task.Factory.StartNew(() => Parallel.Invoke(...));
    Après je vois un peu de magie : des accès à txtInfos non protégés qui n'explosent pas!
    Je ne suis pas un expert WinForms mais ça ne devrait être possible que si tu es déjà sur le thread UI ce qui à priori n'est pas le cas...
    Mystère et boule de gomme...

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Pragmateek,

    L'accès à txtInfo n'explose pas car il écrit juste une fois à la fin du traitement et qu'aucun ne tombe en même temps.
    Mais tu as raison, ce n'est pas propre... Une fois que mon parallel fonctionnera, je mettrait tout ça d'équerre.

    J'ai bien vu un progressBar s'afficher avec ta solution, mais j'ai quelques erreurs.

    En premier lieu, sur "pb.Dock = DockStyle.Top" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opération inter-threads non valide : le contrôle 'acc31830-91b5-4d91-ae8b-dd046046b5a0' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    J'ai du mal à le comprendre car le composant est completement interne au thread.

    Ensuite, le Task.Factory.StartNew lance bien les fonctions,, mais elle n'ont pas encore démarrées que la suite de mon code est executé avant que mes Hashtable aient eu le temps de se remplir.
    Du coup Ils sont null et mon traitement est quaduque.
    Il faudrait que la suite de mon code ne se déclenche que lorsque toutes les taches sont finies.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Citation Envoyé par dacid Voir le message
    L'accès à txtInfo n'explose pas car il écrit juste une fois à la fin du traitement et qu'aucun ne tombe en même temps.
    Ce n'est pas la synchronisation qui m'interpelle mais l'absence d'exception cross-thread.

    Citation Envoyé par dacid Voir le message
    En premier lieu, sur "pb.Dock = DockStyle.Top" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opération inter-threads non valide : le contrôle 'acc31830-91b5-4d91-ae8b-dd046046b5a0' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    J'ai du mal à le comprendre car le composant est completement interne au thread.
    Oui bizarre, pour le coup je m'attendrais plus à une erreur sur la nature STA du thread...

    Citation Envoyé par dacid Voir le message
    Ensuite, le Task.Factory.StartNew lance bien les fonctions,, mais elle n'ont pas encore démarrées que la suite de mon code est executé avant que mes Hashtable aient eu le temps de se remplir.
    Du coup Ils sont null et mon traitement est quaduque.
    Il faudrait que la suite de mon code ne se déclenche que lorsque toutes les taches sont finies.
    C'est normal en effet, il suffit juste d'ajouter le traitement s'exécutant après ta récupération de données au sein de la lambda du StartNew.
    L'idée est de libérer le thread UI pendant la récupération afin que ton interface reste réactive.

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    J'ai oté les choses qui pouvaient faire des problèmes cross-thread.
    Et Suite aux exemples de Krosoft, j'ai mis ma fonction en statique.
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
            private delegate Hashtable GetListeDelg(Form frm, string ficXls, string xlsFeuille, string xlsColId, string xlsColLib, string xlsLigne1, string texte, string regexId = "");
            private static Hashtable GetListe(frmMain frm, string ficXls, string xlsFeuille, string xlsColId, string xlsColLib, string xlsLigne1, string texte, string regexId="") {
                /*if (InvokeRequired) { // Gérer les accès concurentiels.
                    return (Hashtable)Invoke(new GetListeDelg(GetListe), frm, ficXls, xlsFeuille, xlsColId, xlsColLib, xlsLigne1, texte, regexId);
                } // */
                Hashtable ret = new Hashtable();
                int tmp = 0;
                if (!string.IsNullOrEmpty(ficXls.Trim()) && (File.Exists(ficXls)) && (int.TryParse(xlsLigne1, out tmp))) {
                    try {
                        UtilsExcel ue = new UtilsExcel();
                        /*if (frm.tssLabel.GetCurrentParent().InvokeRequired) { // Gérer les accès concurentiels.
                            frm.tssLabel.GetCurrentParent().Invoke(new UtilsControls.setControlStr(UtilsControls.ctrlAddText), frm.tssLabel, texte);
                        } else
                            frm.tssLabel.Text += texte; // */
                        using (var pb = new ProgressBar()) {
                            pb.Name = "pb"+Guid.NewGuid().ToString().Substring(0, 8).Replace("-", "");
                            if (frm.txtInfos.InvokeRequired) { // Gérer les accès concurentiels.
                                frm.txtInfos.Invoke(new UtilsControls.AddControl(UtilsControls.CtlAddControl), frm.txtInfos, pb);
                            } else
                                pb.Parent = frm.txtInfos;
                            Application.DoEvents();
                            pb.Dock = DockStyle.Top;
                            ret = ue.GetListe(ficXls, xlsFeuille, xlsColId, xlsColLib, tmp, pb, regexId); //tssPbMain
                        }
                        string msg = (string.IsNullOrEmpty(ue.msgErr)) ? 
                            "OK. " + frm.tssLabel.Text + ". " + ret.Count + " éléments intégrés." + Environment.NewLine + ue.msgInfo:
                            "KO. " + frm.tssLabel.Text + ". " + ue.msgErr + Environment.NewLine;
                            if (frm.txtInfos.InvokeRequired) { // Gérer les accès concurentiels.
                                frm.txtInfos.Invoke(new UtilsControls.setControlStr(UtilsControls.ctrlAddText), frm.txtInfos, msg);
                            } else
                                frm.txtInfos.Text += msg;
                    } catch (Exception ex) {
                    }
                } // */
                return ret;
            }
     
            static Hashtable htUd = null;
            static Hashtable htCpm = null;
            static Hashtable htItem = null;
            static Hashtable htSpm = null;
            static Hashtable htSol = null;
            static Hashtable htEIPC = null;
            static Hashtable htSbA = null;
            static Hashtable htSbB = null;
            private void btnVal_Click(object sender, EventArgs e) {
                canChangePc = true;
                txtInfos.Text = "";
                tcMain.SelectedIndex = tcMain.SelectedIndex + 1;
                Parallel.Invoke(new ParallelOptions { },  // Task.Factory.StartNew(() => 
                    () => { htUd = GetListe(this, txtFicXlsUd.Text, txtXlsFllUd.Text, txtXlsRefUD.Text, txtXlsLibUD.Text, txtXlsLn1UD.Text, "Lecture de la liste 1"},                 () => { htCpm = GetListe(this, txtFicXlsCPM.Text, txtXlsFllCPM.Text, txtXlsRefCPM.Text, txtXlsLibCPM.Text, txtXlsLn1CPM.Text, "Lecture de la liste 2"); },
                    () => { htItem = GetListe(this, txtFicXlsITEM.Text, txtXlsFllITEM.Text, txtXlsRefITEM.Text, txtXlsLibITEM.Text, txtXlsLn1ITEM.Text, "Lecture de la liste 3"); },
                    () => { htSpm = GetListe(this, txtFicXlsSPM.Text, txtXlsFllSPM.Text, txtXlsRefSPM.Text, txtXlsLibSPM.Text, txtXlsLn1SPM.Text, "Lecture de la liste 4"); },
                    () => { htSol = GetListe(this, txtFicXlsSOL.Text, txtXlsFllSOL.Text, txtXlsRefSOL.Text, txtXlsLibSOL.Text, txtXlsLn1SOL.Text, "Lecture de la liste 5"); },
                    () => { htEIPC = GetListe(this, txtFicXlsEIPCA.Text, txtXlsFllEIPCA.Text, txtXlsRefEIPCA.Text, txtXlsLibEIPCA.Text, txtXlsLn1EIPCA.Text, "Lecture de la liste 6"); },
                    () => { htSbA = GetListe(this, txtFicXlsSBA.Text, txtXlsFllSBA.Text, txtXlsRefSBA.Text, txtXlsLibSBA.Text, txtXlsLn1SBA.Text, "Lecture de la liste des 7"); },
                    () => { htSbB = GetListe(this, txtFicXlsSBB.Text, txtXlsFllSBB.Text, txtXlsRefSBB.Text, txtXlsLibSBB.Text, txtXlsLn1SBB.Text, "Lecture de la liste des 8"); }
                ); // */
                tssLabel.Text = "Traitement des XML";
                EMS_CMF56.Traite(txtChemRepUd.Text, txtFicXsd.Text, htUd, htCpm, htItem, htSpm, htSol, htEIPC, htSbA, htSbB, txtInfos, tssPbMain.ProgressBar);
                tssLabel.Text = "Traitement terminé";
            }
     
        class UtilsControls {
     
            public delegate void AddControl(Control ctlParent, Control ctlEnfant); // Modèle de fonction (prototype) pour l'instanciation.
            public static void CtlAddControl(Control ctlParent, Control ctlEnfant) {
                try {
                    ctlEnfant.Parent = ctlParent;
                } catch (Exception ex) {
                    Log.LogWriter.Instance.WriteException(ex);
                    Log.LogWriter.Instance.FlushLog();
                }
            }
     
            public delegate void setControlStr(Control ctl, string str); // Modèle de fonction (prototype) pour l'instanciation.
            public static void ctrlAddText(Control ctl, string str) {
                Application.DoEvents();
                ctl.Text += str;
            }
     
            public delegate void setPbInc(ProgressBar ctl, int cmp, int total);
            public static void ProgBarInc(ProgressBar pb, int cmp, int total) { // ToolStripProgressBar
                pb.Value = Math.Min(((int)(((double)cmp / total) * 100)), 100);
            }
     
        }
    Mais ça ne fonctionne toujours pas. Le traitement se fait bien, mais le PB ne s'affiche pas.
    Le concept de la class paralell semblait pourtant d'une extreme simplicité.

  6. #6
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    J'ai l'impression de le toucher du bout des doigts.
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
            private delegate Hashtable GetListeDelg(Form frm, string ficXls, string xlsFeuille, string xlsColId, string xlsColLib, string xlsLigne1, string texte, string regexId = "");
            private static Hashtable GetListe(frmMain frm, string ficXls, string xlsFeuille, string xlsColId, string xlsColLib, string xlsLigne1, string texte, string regexId="") {
                /*if (InvokeRequired) { // Gérer les accès concurentiels.
                    return (Hashtable)Invoke(new GetListeDelg(GetListe), frm, ficXls, xlsFeuille, xlsColId, xlsColLib, xlsLigne1, texte, regexId);
                } // */
                Hashtable ret = new Hashtable();
                int tmp = 0;
                if (!string.IsNullOrEmpty(ficXls.Trim()) && (File.Exists(ficXls)) && (int.TryParse(xlsLigne1, out tmp))) {
                    //try {
                        UtilsExcel ue = new UtilsExcel();
                        /*if (frm.tssLabel.GetCurrentParent().InvokeRequired) { // Gérer les accès concurentiels.
                            frm.tssLabel.GetCurrentParent().Invoke(new UtilsControls.setControlStr(UtilsControls.ctrlAddText), frm.tssLabel, texte);
                        } else
                            frm.tssLabel.Text += texte; // */
                        using (var pb = new ProgressBar()) {
                            pb.Name = "pb" + Guid.NewGuid().ToString().Substring(0, 8).Replace("-", "");
                            if (frm.txtInfos.InvokeRequired) { // Gérer les accès concurentiels.
                                frm.txtInfos.Invoke(new UtilsControls.AddControl(UtilsControls.CtlAddControl), frm.txtInfos, pb);
                            } else
                                pb.Parent = frm.txtInfos;
                            Application.DoEvents();
                            if (pb.InvokeRequired) { // Gérer les accès concurentiels.
                                pb.Invoke(new UtilsControls.setControlDock(UtilsControls.ctrlDock), pb, DockStyle.Top);
                            } else
                                pb.Dock = DockStyle.Top;
                            ret = ue.GetListe(ficXls, xlsFeuille, xlsColId, xlsColLib, tmp, pb, regexId); //tssPbMain
                        }
                        string msg = (string.IsNullOrEmpty(ue.msgErr)) ? 
                            "OK. " + frm.tssLabel.Text + ". " + ret.Count + " éléments intégrés." + Environment.NewLine + ue.msgInfo:
                            "KO. " + frm.tssLabel.Text + ". " + ue.msgErr + Environment.NewLine;
                            if (frm.txtInfos.InvokeRequired) { // Gérer les accès concurentiels.
                                frm.txtInfos.Invoke(new UtilsControls.setControlStr(UtilsControls.ctrlAddText), frm.txtInfos, msg);
                            } else
                                frm.txtInfos.Text += msg;
                    /*} catch (Exception ex) {
                        Log.LogWriter.Instance.WriteException(ex);
                        Log.LogWriter.Instance.FlushLog();
                    } // */
                } // */
                return ret;
            }
     
            static Hashtable htUd = null;
            static Hashtable htCpm = null;
            static Hashtable htItem = null;
            static Hashtable htSpm = null;
            static Hashtable htSol = null;
            static Hashtable htEIPC = null;
            static Hashtable htSbA = null;
            static Hashtable htSbB = null;
            private void btnVal_Click(object sender, EventArgs e) {
                canChangePc = true;
                txtInfos.Text = "";
                tcMain.SelectedIndex = tcMain.SelectedIndex + 1;
                int nbCoeurs = 2;
                int.TryParse(Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS"), out nbCoeurs);
                Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = nbCoeurs },  // Task.Factory.StartNew(() => 
                    () => { htUd = GetListe(this, txtFicXlsUd.Text, txtXlsFllUd.Text, txtXlsRefUD.Text, txtXlsLibUD.Text, txtXlsLn1UD.Text, "Lecture de la liste 0"); }, 
                    () => { htCpm = GetListe(this, txtFicXlsCPM.Text, txtXlsFllCPM.Text, txtXlsRefCPM.Text, txtXlsLibCPM.Text, txtXlsLn1CPM.Text, "Lecture de la liste 1"); },
                    () => { htItem = GetListe(this, txtFicXlsITEM.Text, txtXlsFllITEM.Text, txtXlsRefITEM.Text, txtXlsLibITEM.Text, txtXlsLn1ITEM.Text, "Lecture de la liste 2"); },
                    () => { htSpm = GetListe(this, txtFicXlsSPM.Text, txtXlsFllSPM.Text, txtXlsRefSPM.Text, txtXlsLibSPM.Text, txtXlsLn1SPM.Text, "Lecture de la liste 3"); },
                    () => { htSol = GetListe(this, txtFicXlsSOL.Text, txtXlsFllSOL.Text, txtXlsRefSOL.Text, txtXlsLibSOL.Text, txtXlsLn1SOL.Text, "Lecture de la liste 4"); },
                    () => { htEIPC = GetListe(this, txtFicXlsEIPCA.Text, txtXlsFllEIPCA.Text, txtXlsRefEIPCA.Text, txtXlsLibEIPCA.Text, txtXlsLn1EIPCA.Text, "Lecture de la liste 5"); },
                    () => { htSbA = GetListe(this, txtFicXlsSBA.Text, txtXlsFllSBA.Text, txtXlsRefSBA.Text, txtXlsLibSBA.Text, txtXlsLn1SBA.Text, "Lecture de la liste des 6"); },
                    () => { htSbB = GetListe(this, txtFicXlsSBB.Text, txtXlsFllSBB.Text, txtXlsRefSBB.Text, txtXlsLibSBB.Text, txtXlsLn1SBB.Text, "Lecture de la liste des 7"); }
                ); // */
                tssLabel.Text = "Traitement des XML";
                Traite(txtChemRepUd.Text, txtFicXsd.Text, htUd, htCpm, htItem, htSpm, htSol, htEIPC, htSbA, htSbB, txtInfos, tssPbMain.ProgressBar);
                tssLabel.Text = "Traitement terminé";
            }
        class UtilsControls {
     
            public delegate void AddControl(Control ctlParent, Control ctlEnfant); // Modèle de fonction (prototype) pour l'instanciation.
            public static void CtlAddControl(Control ctlParent, Control ctlEnfant) {
                try {
                    ctlEnfant.Parent = ctlParent;
                } catch (Exception ex) {
                    Log.LogWriter.Instance.WriteException(ex);
                    Log.LogWriter.Instance.FlushLog();
                }
            }
     
            public delegate void setControlDock(Control ctl, DockStyle ds); // Modèle de fonction (prototype) pour l'instanciation.
            public static void ctrlDock(Control ctl, DockStyle ds) {
                ctl.Dock = ds;
            }
     
            public delegate void setControlStr(Control ctl, string str); // Modèle de fonction (prototype) pour l'instanciation.
            public static void ctrlAddText(Control ctl, string str) {
                Application.DoEvents();
                ctl.Text += str;
            }
     
            public delegate void setPbInc(ProgressBar ctl, int cmp, int total);
            public static void ProgBarInc(ProgressBar pb, int cmp, int total) { // ToolStripProgressBar
                pb.Value = Math.Min(((int)(((double)cmp / total) * 100)), 100);
            }
     
        }
    Les PB s'affichent bien, mais j'ai une erreur qui est positionnée à la fin du "using (var pb = new ProgressBar()) ".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Opération inter-threads non valide*: le contrôle 'pbf057b4da' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Je pense que c'est parce que les PB créés ont tous les même parent.

    Comment résoudre ça ?

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. problème avec les composant graphique de gwt-ext
    Par ensienne2008 dans le forum GWT et Vaadin
    Réponses: 9
    Dernier message: 16/09/2008, 09h32
  3. Problème avec les pilotes graphique ATI
    Par vdumont dans le forum Matériel
    Réponses: 5
    Dernier message: 06/04/2006, 09h05
  4. Violation d'accès avec les composants Word 97/ 2000
    Par edechaux dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/03/2006, 09h48
  5. Réponses: 13
    Dernier message: 19/01/2006, 10h06

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