Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : communication entre thread [ Windows / Process ] (olibara)

dimanche 16 novembre 2008 à 09:53:17 | communication entre thread

olibara

Bonjour

Si quelqu'un se sent expert en Thread il pourra peut etre m'aider

L'ideal pour expliquer serait de pouvoir envoyer un bout de code malheureusement ca reste impossible sur ce Forum

Et le copie coller de code dans le message est totalement indigeste.
(N.B. Sauf erreur de ma part je pense que c'est un des rares forum qui ne gere pas la mise en forme ou l'envoi de code lié a un message)

Explication

Le but est de ne pas lancer un traitement lourd dans le thread de l'UI mais d'avoir une mise a jour de celui ci durant le process

Je lance donc le thread secondaire avec un threadpool et j'utilise deux event pour mettre a jour ma form

En mode debug ca marche tres bien
En mode release ca bloque apres plusieurs itérations !

Si quelqu'un se sent le courage d'essayer de comprendre avec moi on essayera de trouver la bonne maniere de communiquer le bout de code concerné

Merci beaucoup pour vos aides

dimanche 16 novembre 2008 à 10:02:17 | Re : communication entre thread

Robert33

Membre Club
Bonjour,

Sans voir le code il est difficile de répondre.
neamoins voici quelques pistes:
En .net les evenements ne sont pas "postés", mais executés au travers d'un delegate (le thread ne demande pas à la "form" de traiter  le message, mais le traite lui-même) le traitement est donc synchrone, il faut donc que le traitement de l'evenement soit court, dans le code de la "form" fais donc attention au evenements en cascade.
Si ton traitement bloque après quelques itérations, c'est sans doute un deadlock. fais attention aux classes et aux méthodes que tu utilises, l faut qu'elles soient toutes "thread safe" sinon mets en place des sémaphores ou des sections critiques.

en esperant t'avoir donné des info utiles.
++
C# is amazing, enjoy it!

dimanche 16 novembre 2008 à 10:10:18 | Re : communication entre thread

olibara

Merci Robert

Voici ce que je fais

Le process appelé contient deux boucles imbriquées qui remplissent une datatable de n x n
J'ai deux event : 1 pour l'ajout de row, 1 pour l'ajout de cellule
L'event ajout de cellule affiche un compteut dans la form appellante
L'event ajout de row fait un refresh du dgv qui possede la datatable en datasource


Voci la partie du code dans la form appellante


      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);
      }
    }
    // *****************************************************************************************

    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);
      lbl_Progress.Refresh();
    }

    // *****************************************************************************************
    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();
    }


lundi 17 novembre 2008 à 10:03:12 | Re : communication entre thread

leprov

Comme te l'as expliqué robert, les events sont executés dans le thread qui les appelles. De plus, la msdn spécifie que l'ihm ne devrais jamais etre modifiée au travers d'un autre thread que celui qui l'a créé. A mon avis, ton code doit vraiment pas bien fonctionner. Tu devrais essayer de voir du coté de l'objet backgroundworker qui va gérer le thread secondaire pour toi

lundi 17 novembre 2008 à 17:36:44 | Re : communication entre thread

olibara

Salut

J'ai un problème en Release c'est un fait (en debug ca marche en "apparance" tres bien)

Mais je n'ai pas envie de jeter le BB avec l'eau du bain et j'aimerais comprendre ce que je peux ou dois faire dans le modele que j'ai utilisé pour permettre la mise a jour de mon DGV

Car si le Pavé qu'est le Backroundworker peut y arriver, il n'y a pas de raison qu'on ne puisse pas y arriver avec les outils de base !




mardi 18 novembre 2008 à 10:21:38 | Re : communication entre thread

leprov

Avec les outils de base, tu devras regarder du coté du tuto sur le site concernant les opération cross thread

vendredi 21 novembre 2008 à 09:27:49 | Re : communication entre thread

Robert33

Membre Club
Réponse acceptée !
Bonjour,

Si j'ai bien tout compris au code, une DataTable est passée en référence aux threads (via DistMatrix ), qui y insèrent des lignes puis des cellules, en alertant la forme à chaque opération, qui elle essaye de présenter une DataView actualisée à chaque événement.

Je ne suis pas certain qu'une DataTable soit ThreadSafe.
Il faudrait peut être mutualisé les d'insertions et de mise à jour de la DataTable depuis des méthodes de DistMatrix et y ajouter une protection par une section critique, de manière à être certain que 2 threads n'accèdent pas en même temps.

Il est fort possible qu'en mode debug l'environnement prenne en charge certaines situations de conflit d'accès.
Bien que je n'ai pas rencontré ce genre de problème en C# c'est un phénomène bien connu en C++ natif.

Pour ma part, dans ce genre de situation je laisse la forme maitresse gérer la table (insertion, mises à jour), et je ne demande aux threads que le calcul des données.


C# is amazing, enjoy it!

vendredi 21 novembre 2008 à 09:37:05 | Re : communication entre thread

olibara

Merci Robert

Ton explication m'aide a mieux comprendre le probleme
Je vais continuer a investiguer et tester !

Si j'y arrive je communique !

samedi 22 novembre 2008 à 22:45:49 | Re : communication entre thread

olibara

Bonsoir Robert33

Voila j'ai réussi a faire tourner la chose proprement en suivant ta sugestion de separer les operatoions de calcul qui se font dans le thread secondaire et la mise a jour de la datatable, qui se fait dans le tread principal.

Je n'ai donc plus qu'un seul event qui renvoie l'absice, l'ordonée et la valeur a ajouter dans la datatable !


La derniere chose que j'ai du chipoter c'est pour traiter proprement la fin de l'execution du Thread.
Ca a ce moment seulement je voulais activer le print ou l'export du DGV créé

Pour faire cela j'ai encore du ajouter deux events et deux delegates !!
Voici ce que ca donne :

    /// <summary>
    /// Event et delegate de traitement fin de Thread
    /// </summary>
    public delegate void StopDistDelegateHandler();
    public event StopDistDelegateHandler enableBtn;

    public frmDist(DataTable dt)
    {
      dtAdr = dt;
      InitializeComponent();
    }

    public void ShowMatrix(bool VV)
    {
      DistMatrix dm = new DistMatrix();
      dm.VV = VV;
      dm.AddCell += new DistMatrix.StepCellDelegateHandler(Dist_StepCell);
      dtDist = dm.CreateTable(dtAdr);
      dgv_Dist.DataSource = dtDist;

      enableBtn += new StopDistDelegateHandler(EnableBtn);

      ThreadPool.QueueUserWorkItem(new WaitCallback(Process), dm);
    }

    public delegate void StepCellDelegateHandler(string x, string y, double dist);

    // *****************************************************************************************
    void Process(Object DM)
    {
      ((DistMatrix)DM).setMatrix(dtAdr);
      enableBtn();   // fin du Thread
    }
    // *****************************************************************************************
    private void EnableBtn()
    {
      if (this.InvokeRequired)
      {
        try
        {
          this.Invoke(new StopDistDelegateHandler(BtnEnable), new object[] {  });
          return;
        }
        catch (Exception e)
        {
          MessageBox.Show(e.Message);
        }
      }
      else
      {
        BtnEnable();
      }
    }
    // *****************************************************************************************
    private void BtnEnable()
    {
      btn_print.Enabled = true;
      btn_export.Enabled = true;
    }


samedi 22 novembre 2008 à 23:25:41 | Re : communication entre thread

Robert33

Membre Club
ça parait propre comme ça,
Content de t'avoir aidé.

C# is amazing, enjoy it!



Cette discussion est classé dans : code, communication, quelqu, thread, sent


Répondre à ce message

Sujets en rapport avec ce message

port de communication avec c# [ par stoukou ] s'il vous plait ,connaissez vous le code c# qui me permet de lister les ports des communications (ex:http80....)dans mon pc,ainsi le code qui me perme Thread [ par Equinox84 ] Bonjour, Désolé de poser cette question mais je viens de faire un mois de Java et j'ai du mal a reprendre les notions de thread en C# En fait je vou Objet Com en c# ? [ par littlebigfox ] Bonjour a tous!Je recherche un moyen d'executer une dll crée en c# depuis un code asp. Est-ce que quelqu'un connais une facon simple de proceder? Ou e Thread : un code en vs2003 vers vs2005 [ par cedoli ] Salut à tous.J'utilise un thread pour aller lire le code source d'une page HTML et l'afficher dans un TB.void go()         {            (new client controle listbox dans un thread [ par diego29 ] bonjour ,je souhaite afficher des nombres premiers dans une listbox à travers un threadvoici mon code sans erreur de compilation mais qui n'affiche ri [2.0] BackWorker & synchronisation main thread [ par scoubidou944 ] bonsoir,je viens à la pêche au code propre comme d'hab';pJe refais mon LiveUpdate en .NET 2.0 et j'ai découvert le BackWorker :)J'explique le programm Éviter qu'une thread perde la main [ par narfight ] Bonjour,Je voudrais savoir comment signaler qu'une partie de mon code exécuté dans une thread soit éxécuté en 1 seul fois et donc que le thread ne per Thread + Form.Show(); [ par thebigboss ] Bonjour,je fais un bout de code qui pourrait être résumé par le code suivant:J'ai une MainForm qui crée un objet Form2: Form2 frm2=new Form2();Mais sa Pb WebBrowser [ par SfyLer ] Voila j'ai un pb assez urgent et assez important !en effet pour mon code j'ai besoin d'actualiser souvent une form contenant un webbroswer.Or a chaque Appel synchrone bloquant (code TRES simplifié) [ par Zeroc00l ] Bonjour !J'ai un petit souci sur les appels synchrones en C#Je vais simplifier le probleme :Dans un thread j'éxécute mon code général qui ressemble à


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.