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 :

C# - Thread - Classe Splash Form


Sujet :

C#

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 133
    Points : 57
    Points
    57
    Par défaut C# - Thread - Classe Splash Form
    Hello,

    J'ai crée une classe pour afficher une form pendant les traitements assez longs (formSplash), mais je reçoit l'erreur suivante -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opération inter-threads non valide : le contrôle 'FormSplash' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    .

    A mon avis, il faudrait utiliser des "delegate" mais je ne vois pas du tout comment faire ?


    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace Test
    {
        class Splash
        {
            static Thread thread = null;
            static FormSplash formSplash = null;
     
            public static void launch()
            {
                if (formSplash == null)
                {
                    thread = new Thread(new ThreadStart(showForm));
                    thread.IsBackground = true;
                    thread.Start();
                }
            }
     
            public static void stop()
            {
                formSplash.Close();
            }
     
     
            private static void showForm()
            {
                formSplash = new FormSplash();
                formSplash.ShowDialog();
            }
        }
    }
    J'appelle depuis mainForm -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Splash.launch();
    /* ... */
    Splash.stop();
    Pouvez-vous m'aider svp ?

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Tu fais un traitement dans un thread au niveau de ton FormSplash je suppose ?

    Pour éviter ce problème, regarder du côté de la méthode Invoke. Tu peux aussi regarder le composant windows BackgroundWorker. Il met à ta disposition un événement de progression, si tu utilises une barre de progression sur ton écran par exemple, et si tu places ton code à ce niveau tu n'auras plus ce problème également.

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 133
    Points : 57
    Points
    57
    Par défaut
    Oui, le problème est que la form est crée depuis le thread (lancé par la classe).

    Je cherche comment fermer la form lorsque j'execute la fonction stop() de la classe.

    Puisque la classe est statique, je ne sais pas comment utiliser Invoke.

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    D'accord, je pensais qu'il y avait un traitement dans le SplashScreen, mais à priori c'est juste un écran d'attente. Donc tu ne fais aucun traitement long au niveau du SplashForm, dans le principe ce que tu cherches à faire c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Splash.launch();
    // Mon traitement long ici
    Splash.stop();
    J'ai bien compris ?

    Dans l'exemple, il faudrait pouvoir exécuter la méthode Close depuis le thread utilisé pour afficher le formulaire, je ne sais pas comment le faire, en admettant que ce soit possible.

    Tu n'as pas moyen de faire exécuter ton traitement long par le SplashScreen ?

    Edit : j'ai peut être trouvé, ça devrait fonctionner pour fermer l'écran, à tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    formSplash.Invoke(new MethodInvoker(delegate { formSplash.Close(); }));

  5. #5
    Membre du Club
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 133
    Points : 57
    Points
    57
    Par défaut
    Oui, c'est ça .


    En fait, mon appli effectue certains traitements longs, de temps en temps, et je cherche à afficher une simple Form qui empêche l'utilisateur de toucher à la form parente.

    Je ne souhaite pas effectuer le traitement long dans la Splash.


    Merci pour ta réponse, pour le code que tu ma donné, ca ferme bien la fenêtre mais ensuite j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Impossible d'accéder à un objet supprimé.
    Nom de l'objet : 'FormSplash'.

    EDIT 2: j'ai rajouté formSplash = null; ensuite, et ça l'air de marcher.

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est ton test lors de la création du thread qui génère ça, autant le supprimer

    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
    class Splash
    {
        static Form formSplash = null;
     
        public static void launch()
        {
            Thread thread = new Thread(new ThreadStart(showForm));
            thread.IsBackground = true;
            thread.Start();
        }
     
        public static void stop()
        {
            formSplash.Invoke(new MethodInvoker(delegate { formSplash.Close(); formSplash.Dispose(); }));
        }
     
        private static void showForm()
        {
            if (formSplash == null) { formSplash = new Form(); }
            formSplash.ShowDialog();
        }
    }
    N'oublie pas le à la fin

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

Discussions similaires

  1. Javadoc des classes oracle.forms.*
    Par loudo dans le forum Forms
    Réponses: 1
    Dernier message: 02/08/2007, 14h31
  2. [VB6] Module de classe ( et Form )
    Par lyraaa dans le forum VB 6 et antérieur
    Réponses: 32
    Dernier message: 20/06/2007, 12h29
  3. Intergrer une classe au form
    Par omdafer dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/05/2007, 22h51
  4. Thread : class Thread VS. interface Runnable
    Par shawty dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 11/03/2007, 21h09
  5. [VS 2003][dessin] synchronizer un thread avec une forme
    Par Harry_polin dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/10/2005, 10h31

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