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 :

ThreadPool bloque un mode release


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut ThreadPool bloque un mode release
    Bonjour

    J'ai toujours pas bien digéré l'usage des Thread

    Dans l'exemple ci-apres depuis une form j'appelle une methode dans un nouveau thread en utilisant Treadpool

    Ma methode contient deux event permettant de mettre eu datagridview a jour dans la form

    En debug, ca marche tres bien.
    En release ca bloque en cours de traitement et je dois fermer l'application
    Je sais en tout cas que je n'arrive pas au bout de la boucle de traitement

    Un oeil de lynx repere-t-il une grosse betise ?


    Voici le code d'appel

    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
    ..
          DistMatrix dm = new DistMatrix();
          dm.VV = VV;
          dm.AddRow += new DistMatrix.StepRowDelegateHandler(Dist_StepRow);
          dm.AddCell += new DistMatrix.StepCellDelegateHandler(Dist_StepCell);
          ThreadPool.QueueUserWorkItem(new WaitCallback(Process),dm);
        }
     
        public delegate void StepCellDelegateHandler(int a, int b);
        public delegate void StepRowDelegateHandler(DataTable dt);
     
        // *****************************************************************************************
        void Process(Object DM)
        {
          DataTable dtn = ((DistMatrix)DM).getMatrix(dtAdr);
        }
     
        // *****************************************************************************************
        private void Dist_StepCell(int a, int b)
        {
          if (this.InvokeRequired)
          {
            try
            {
              this.Invoke(new StepCellDelegateHandler(StepCell), new object[] { a, b });
              return;
            }
            catch (Exception e)
            {
              MessageBox.Show(e.Message);
            }
          }
          else
          {
            this.StepCell(a, b);
          }
        }
    Voici la synthese du traitement

    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
      // ***********************************************************************************
        public DataTable getMatrix(DataTable dtIn)
        {
          DataTable dtMatrix=CreateTable(dtIn);
          for (i = 0; i < dtIn.Rows.Count; i++)
          {
            DataRow cRowY = dtIn.Rows[i];
            string fromY = cRowY["addrId"].ToString();
     
            for (j = 0; j < dtIn.Rows.Count; j++)
            {
              DataRow cRowX = dtIn.Rows[j];
              addDtCell(dtMatrix,cRowX["addrId"].ToString(),fromY,5);
              if (AddCell != null)
              {
                AddCell(j,i);
              }
            }
          }
     
          if (AddRow != null)
          {
            AddRow(dtMatrix);
          }
     
          if (AddCell != null)
          {
            AddCell(-1, -1);
          }
     
          return dtMatrix;
        }
        // ***********************************************************************************
        private void addDtCell(DataTable DstMatrix, string rX, string rY, double dist)
        {
          DataView dv = new DataView(DstMatrix);
          dv.Sort = "Start";
          int idx = dv.Find(rY);
          DataRow cRow = null;
          if (idx < 0)
          {
            cRow = DstMatrix.Rows.Add();
            cRow["Start"] = rY;
            if (AddRow != null)
            {
              AddRow(DstMatrix);
            }
          }
          else
          {
            cRow = dv[idx].Row;
          }
          if (dist > 0.01)
          {
            cRow[rX] = dist;
          }
        }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    A mon avis le problème est dans Dist_StepRow et Dist_StepCell... que fais-tu dans ces méthodes ? n'oublie pas qu'elles vont s'exécuter sur le thread de traitement, pas sur le thread de l'UI (puisque tu appelles AddRow et AddCell pendant le traitement). Donc si Dist_StepRow et Dist_StepCell accèdent à l'interface graphique, ça foire...

    Tu n'aurais pas fait un truc comme ça par hasard ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Control.CheckForIllegalCrossThreadCalls = false;
    Avec ça, ça peut passer en debug et pas en release...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tomlev


    Ci joint plus en détail l'usage des deux methode

    En fait le but du jeux c'est precisément de mettre a jour le UI a certaines étapes de mon traitement dans le thread appelé

    C'est pour ca que je gere deux event

    Mais bon je reve peut etre et ce n'est peut etre pas possible (mais ca m'etonne un peu)

    Dans le cas contraire, comment aurais-je du faire ?

    NB :

    Je n'ai pas utilisé ceci mais peut-etre est-ce implicite en mode debug.

    Control.CheckForIllegalCrossThreadCalls = false;

    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
        // *****************************************************************************************
        private void Dist_StepCell(int a, int b)
        {
          if (this.InvokeRequired)
          {
            try
            {
              this.Invoke(new StepCellDelegateHandler(StepCell), new object[] { a, b });
              return;
            }
            catch (Exception e)
            {
              MessageBox.Show(e.Message);
            }
          }
          else
          {
            this.StepCell(a, b);
          }
        }
        // *****************************************************************************************
     
        private void StepCell(int X,int Y)
        {
          if (X == -1)
          {
            MessageBox.Show("Call -1");
            btn_print.Enabled = true;
            btn_export.Enabled = true;
            toolStrip1.Enabled = true;
            return;
          }
          lbl_Progress.Text = string.Format("{0}-{1} / {2}", Y, X,dtAdr.Rows.Count);
        }
     
        // *****************************************************************************************
        private void Dist_StepRow(DataTable dt)
        {
          if (this.InvokeRequired)
          {
            try
            {
              this.Invoke(new StepRowDelegateHandler(AddRow), new object[] { dt });
              return;
            }
            catch (Exception e)
            {
              MessageBox.Show("Row:"+e.Message);
            }
          }
          else
          {
            this.AddRow(dt);
          }
        }
     
        // *****************************************************************************************
        private void AddRow(DataTable Dt)
        {
          if (dgv_Dist.DataSource == null)
          {
            dgv_Dist.DataSource = Dt;
            foreach (DataGridViewColumn dgvc in dgv_Dist.Columns)
            {
              DataGridViewCellStyle style = new DataGridViewCellStyle();
              style.Format = "N2";
              style.Alignment = DataGridViewContentAlignment.MiddleRight;
              dgvc.DefaultCellStyle = style;
            }
          }
          dgv_Dist.Refresh();
        }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bizarre, je vois pas ce qui pose problème...

    sinon essaie avec un BackgroundWorker, en utilisant l'évènement ProgressChanged pour mettre à jour l'UI

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tomlev

    BakcroundWorker ....

    Berk !
    J'ai déja donné !

    J'avais précisément envie de me faire la main avec les Thread

    Bon je continue mon investigation

    Ce que je sais c'est que ca plante +/- au 240eme appel de StepCell
    En debug j'en fais 400

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    BakcroundWorker ....

    Berk !
    J'ai déja donné !
    qu'est-ce que tu lui reproches ? moi je trouve ça plus pratique que les threads...

Discussions similaires

  1. Erreur LNK1104 uniquement en mode release
    Par dus dans le forum MFC
    Réponses: 1
    Dernier message: 30/09/2005, 14h03
  2. Pas d'appel à une fonction si mode Release
    Par Crisanar dans le forum C++
    Réponses: 8
    Dernier message: 17/09/2005, 04h54
  3. Réponses: 11
    Dernier message: 09/07/2005, 08h47
  4. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39
  5. bloqué en mode Release
    Par matsch77 dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 17h17

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