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 :

Instanciation d'un thread


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut Instanciation d'un thread
    Bonjour à tous,
    je m'inspire d'un tutoriel pour créer un splashscreen dans mon application et depuis un moment j'ai une erreur qui m'embête:
    Object reference not set to an instance of an object
    au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ms_oThread.IsBackground = true;
    dans la portion de code suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     // Threading
            static SplashScreen ms_frmSplash = null;
            static Thread ms_oThread = null;
     
    static public void ShowSplashScreen()
            {                       
                if (ms_frmSplash != null) return;
                ms_oThread.IsBackground = true;
                ms_oThread.SetApartmentState(ApartmentState.STA);
                ms_oThread.Start();
            }

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut
    Aussitôt résolut un autre problème survient. Pour le premier cas, il fallait créer une nouvelle instance du thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ms_oThread = new Thread(new ThreadStart(SplashScreen.ShowForm));
    Le second problème à résoudre est le suivant:
    Cross-thread operation not valid: Control 'lblTimeRemaining' accessed from a thread other than the thread it was created on.
    et se trouve au niveau de " lblTimeRemaining.Text = ""; " dans le 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
     
    private void ReadIncrements()
            {
                string sPBIncrementPerTimerInterval = RegistryAccess.GetStringRegistryValue(REGVALUE_PB_MILISECOND_INCREMENT, "0.0015");
                double dblResult;
                if (Double.TryParse(sPBIncrementPerTimerInterval, System.Globalization.NumberStyles.Float,
                    System.Globalization.NumberFormatInfo.InvariantInfo, out dblResult))
                    m_dblPBIncrementPerTimerInerval = dblResult;
                else
                    m_dblPBIncrementPerTimerInerval = .0015;
     
                string sPBPreviousPctComplete = RegistryAccess.GetStringRegistryValue(REGVALUE_PB_PERCENTS, "");
                if (sPBPreviousPctComplete != "")
                {
                    string[] aTimes = sPBPreviousPctComplete.Split(null);
                    m_alPreviousCompletionFraction = new ArrayList();
                    for (int i = 0; i < aTimes.Length; i++)
                    {
                        double dblVal;
                        if (Double.TryParse(aTimes[i],
                                System.Globalization.NumberStyles.Float,
                                System.Globalization.NumberFormatInfo.InvariantInfo,
                                out dblVal))
                            m_alPreviousCompletionFraction.Add(dblVal);
                        else
                            m_alPreviousCompletionFraction.Add(1.0);
                    }
                }
                else
                {
                    m_bFirtLaunch = true;
                    lblTimeRemaining.Text = ""; //  C'EST ICI QUE SE TROUVE L'ERREUR
                }
            }
    merci d'avance pour votre aide.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    C'est normal, c'est le thread UI qui doit modifier le texte de ton contrôle.

    Voici un exemple de ce que tu dois 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
     
    private delegate void SetTextDelegate(string texte);
     
    private void SetText(string texte)
    {
        if (this.textBox1.InvokeRequired)
        {
            // Le thread délègue la tâche
            this.textBox1.Invoke(new SetTextDelegate(this.SetText), texte);
        }
        else
        {
            // C'est le thread UI qui exécute le traitement
            this.textBox1.Text = texte;
        }
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur Développement Logiciel
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Développement Logiciel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut
    Merci Aeronia, ça marche!

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

Discussions similaires

  1. Instanciation d'objet dans un thread : déconseillé ?
    Par SQUAL dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 12/04/2012, 21h09
  2. [C#] Nombre de threads à instancier inconnu
    Par PxPar dans le forum Services Windows
    Réponses: 4
    Dernier message: 12/04/2011, 15h59
  3. Thread et instanciation
    Par ranell dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 28/09/2007, 20h57
  4. Problème d'instanciation de tableau de Threads
    Par rune93 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 14/03/2007, 10h10
  5. [C#] Instancier un objet Form depuis un Thread
    Par Philipili dans le forum Windows Forms
    Réponses: 10
    Dernier message: 13/05/2006, 13h40

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