2010-10-26 3 views
0

J'ai un thread qui met actuellement à jour un DataGridView sur un onglet (STATUS) d'un TabControl. Ce thread fonctionne actuellement très bien. Ce que je voudrais faire, c'est pouvoir mettre à jour une petite collection de contrôles sur un onglet différent (SYNCH.) Si l'on clique sur le bouton pour lancer le thread alors que sur le SYNCH. languette. J'ai considéré passer un nombre entier dans le fil à Thread.Start(), mais alors je ne suis pas sûr de savoir comment modifier le paramètre int, qui dans ce cas est la propriété TabControl.SelectedIndex, après le thread a été démarré. C'est un problème parce que le changement de tabulation suspend le thread, mais ne permet pas de passer un nouvel index de tabulation.Est-il possible de passer une nouvelle valeur de paramètre dans un thread en cours d'exécution?

Je peux probablement décomposer cette fonctionnalité en un thread différent que je ne démarrerais que sur SYNCH. onglet, mais toutes les fonctionnalités de requête de périphérique sont déjà traitées dans le thread existant. Je suis en quelque sorte opposé à la duplication des fonctionnalités pour une solution de contournement rapide. Voici la fonction que j'ai programmée pour "résoudre" le problème, mais elle est inefficace car la variable tabIndex est définie à Thread.Start et je ne peux pas la modifier pour le moment. y a-il un moyen de résoudre cela?

void writeTable(int tabIndex) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new ctrlStatDel(writeTable), tabIndex); 
      return; 
     } 

     switch((appTabs)tabIndex) 
     { 
      case appTabs.STATUS: 
       int i4 = 0; 

       ctrlProgBar.Value = 0; 

       for (int i2 = 0; i2 < 4; i2++) 
       { 
        for (int i3 = 0; i3 < 10; i3++) 
        { 
         statusDGV.CurrentCell = statusDGV[i2, i3]; 
         statusDGV.CurrentCell.Value = colFields[i4]; 
         i4++; 
        } 
        ctrlProgBar.PerformStep(); 
       } 

       statusDGV.CurrentCell = null; 

       break; 

      case appTabs.SYNCH: 
       for (int idx = 0; idx < statFields.Count; idx++) 
        statControls[idx].Text = statFields[idx]; 
       break; 
     } 
    } 
+2

Pourriez-vous simplement ne pas créer l'index de tabulation que le thread utilise une variable de niveau classe, puis autoriser l'événement tab_changed à définir cette variable? Tant que nous ne parlons que d'un nombre entier, il ne devrait pas y avoir de problèmes avec d'autres threads affectant l'interface utilisateur ou les deadlocks ou quoi que ce soit. – Jrud

Répondre

1

Ce que vous semblez avoir besoin est d'exécuter une méthode différente sur un fil lorsqu'un autre onglet est sélectionné. Faites le choix quand (avant) de démarrer le fil, pas dans le fil.

Sauf si vous voulez mettre à jour le DataGrid et les contrôles (je n'ai pas lu cela, mais il semble plausible). Dans ce cas, vous pouvez passer un simple booléen comme paramètre (int le paramètre object state).

Vous n'avez pas publié le code de démarrage de la bande de roulement, qui est le plus pertinent.

Questions connexes