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

Windows Forms Discussion :

[C#2.0] Multithreading Afficher une folderbrowserdialog


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Par défaut [C#2.0] Multithreading Afficher une folderbrowserdialog
    Bonjour

    Dans mon appli je fais du multithreading en fait y en a 2, car j'ai un traitement qui me frize complètement mon UI. Alors j'effectue ce traitement sur un autre thread jusque la tout va bien. Mais à un moment du traitement l'utilisateur doit choisir un répertoire donc j'affiche une folderbrowserdialog depuis le thread qui effectue le traitement; et la sa plante j'ai le message suivant:
    Le thread Actuel doit être en mode STA, avant que des appels OLE puissent être effectuées. Assurez-vous que votre fonction Main est marquée STAThreadAttribute. Cette exception n'est déclenchée que si un débogueur est attaché au processus.
    Voici le code qui effectue cette opération:
    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
    private string RechercheDossier(string NomDoc, bool DossierOk)
            {
                bool rep = false;
                string Dossier=null;
                if (DossierOk==false)
                {
                    MessageBox.Show("Le chemin pour : " + NomDoc + " n'existe pas. Sélectionner un chemin valide",
                                        "CHEMIN ACCES ERRONNE", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    FolderBrowserDialog1.SelectedPath = ConfigurationManager.AppSettings[@"DirPathStd"];
                    FolderBrowserDialog1.Description = "DOSSIER NON TROUVE";
                    FolderBrowserDialog1.ShowNewFolderButton = false;
                    while (!rep)
                    {
                        if (FolderBrowserDialog1.ShowDialog()==DialogResult.OK)
                        {
                            Dossier = FolderBrowserDialog1.SelectedPath;
                            rep = true;
                        }
                    }
                }
                else
                {
                    if (_ApplyDefaultValue)
                    {
                        MessageBox.Show("Le document : " + NomDoc + " n'a pas été trouvé. Vérifiez l'orthographe ou l'ajouter dans la base",
                            "DOCUMENT NON TROUVE", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Sélectionnez un répertoire pour vos exports!", "EXPORT A LA DEMANDE",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    FolderBrowserDialog1.SelectedPath = ConfigurationManager.AppSettings[@"DirPathStd"];
                    FolderBrowserDialog1.Description = "SELECTIONNEZ UN REPERTOIRE";
                    FolderBrowserDialog1.ShowNewFolderButton = false;
                    while (!rep)
                    {
                        if (FolderBrowserDialog1.ShowDialog()==DialogResult.OK)
                        {
                            Dossier = FolderBrowserDialog1.SelectedPath;
                            rep = true;
                        }
                    }
                }
                return (Dossier);
            }
    Sans doute question bête mais je sèche alors help

  2. #2
    Membre éclairé
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Par défaut
    Bon j'ai trouvé une discussion sur le forum qui traite de ce sujet mais je voudrai savoir comment implémenter cette solution à 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
    public void ShowFolderBrowserDialog()
            {
                parent_form.BeginInvoke(new MethodInvoker(delegate
                {
                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                    {
                        /*
                         * puisque l'on est plus dans le thread ayant crée
                         * Form3, assigner directement textBox1 produit
                         * une opération Inter-Thread non valide pour WinForm donc ...
                         * textBox1.Text = folderBrowserDialog1.SelectedPath;
                         */
                        this.Invoke(new MethodInvoker(delegate
                        {
                            textBox1.Text = folderBrowserDialog1.SelectedPath;
                        }));
                    }
                }));
            }

  3. #3
    Membre éclairé
    Homme Profil pro
    DBA - Développeur BI
    Inscrit en
    Avril 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : DBA - Développeur BI
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2003
    Messages : 442
    Par défaut
    C'est resolu en fait comme l'a dit SirJulio, que je cite:
    en fait, il y a moyen plus simple de faire ca. Je me suis arraché les cheveux pour un probleme equivalent concernant la recuperation d'un dataobject du presse-papier sur un thread lancé par un BeginInvoke. En fait, quand tu avais le bug sur ton premier post, c'etait du au fait que les threads du ThreadPool (qui sont utilisé quand tu BeginInvoke un delegate) sont forcement en MTA, et donc des que tu touches le clipboard (ou un dialog comme celui dont il est question), ca ne marche pas. Maintenant que tu utilises un thread dedié pour chaque form, il existe une solution tres simple (je reprends le callback du bouton de ton exemple qui lancé le thread qui allait planté) :
    et la ligne de code qui va bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread_bug.SetApartmentState(ApartmentState.STA);
    et la ma forlderbrowserdialog s'affiche correctement.

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

Discussions similaires

  1. [MFC] afficher une ProgressBar dans une barre d'etat
    Par guillaume21 dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2007, 11h16
  2. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  3. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49
  4. Afficher une buffer de pixel avec Direct3D
    Par Black_Daimond dans le forum DirectX
    Réponses: 4
    Dernier message: 27/12/2002, 22h18
  5. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20

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