2016-08-20 2 views
0

si je démarre mon application C# Windows Form, les boutons se bloque, car il est cycle infini. Je veux voir le changement de valeur variable de Bouton2 cliquez dans la boucle infinie de button1 à travers la variable globaleLe bouton se bloque avec la boucle infinie

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace XX_5 
{ 
    public partial class Form1 : Form 
    { 
     private int g; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     {   
      int i = 0; 

      for (;;) 
      { 
       textBox1.AppendText("ID: [" + i++ + "] Variable value: [" + g + "]\n");  
      } 
     }  
     private void button2_Click(object sender, EventArgs e) 
     { 
      g = 1; 
     } 
    } 
} 
+1

Vous devez lire sur les discussions. Si vous démarrez une boucle comme celle de votre thread d'interface utilisateur principal, cela l'empêche de faire quoi que ce soit d'autre. Il serait également utile si vous avez expliqué pourquoi vous essayez de faire cela ... votre code n'a pas beaucoup de sens. –

+0

@Grant Winney bonjour, pouvez-vous me montrer sur un exemple comment faire la même chose mais juste, boucle infinie dans l'interface graphique et la valeur de bouton2 pour traiter à l'intérieur du bouton1 Je veux juste le changer lorsque le bouton 2 est pressé –

+1

trop large, en particulier étant donné le nombre de questions et réponses qui existent déjà sur Stack Overflow qui répondent au concept de base de ** ne pas bloquer le thread d'interface utilisateur **. Un seul thread gère le dessin de l'interface utilisateur. Si vous ne laissez pas ce thread faire quoi que ce soit d'autre, parce que vous êtes coincé dans une boucle infinie, le fait de retirer l'interface utilisateur ne se produira pas. Voir le duplicata marqué pour quelques conseils sur la façon de traiter cela. –

Répondre

-1

Si vous gardez la boucle infinie dans le gestionnaire d'événements bouton clic, votre application se bloque définitivement, puisque les fenêtres Impossible d'obtenir/envoyer/traiter les messages plus.

Vous pouvez fixer comme ce qui suit:

private void button1_Click(object sender, EventArgs e) 
    {   
     int i = 0; 
     textBox1.AppendText("ID: [" + i++ + "] Variable value: [" + g + "]\n"); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     // int g = 1; // here you declare a local variable 
     g = 1; // use the member variable instead 
    } 
+1

"i" devrait également être membre. – gopher2008

+0

oui maintenant la variable fonctionne mais comment voir ce changement de variable obtenu de button2 cliquez dans mon cycle sans fin, comment faire le travail de bouton –

+0

Le code original montre clairement une boucle, mais il n'y a pas de boucle dans cette réponse, rendant cette suggestion complètement inappropriée dans ce cas. –

-1

Jetez un oeil à la commande de la minuterie (sous l'onglet Composants dans la boîte à outils). Vous pouvez placer votre code (sans la boucle for) et il s'exécutera toutes les x millisecondes avec l'avantage qu'il ne sera pas bloqué. Vous devrez définir votre variable i au niveau du formulaire lorsque vous faites cela. Votre minuteur peut alors accéder à cette 'variable globale'.

Quelque chose comme ça ...

public partial class Form1 : Form 
{ 

    private int i = 0; 
    private int g = 0; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     g = 1; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     textBox1.AppendText("ID: [" + i++ + "] Variable value: [" + g + "]\n"); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     timer1.Enabled = true; 
    } 
} 
+0

pas vraiment comprendre comment minuterie fonctionne pour ce cas, pouvez-vous me montrer un exemple, important pour moi d'obtenir cette boucle sans fin à l'intérieur et voir le changement de variable obtenu à partir de button2 click –

+0

Rien dans le code original implique un retard périodique entre les opérations, donc une minuterie est une suggestion complètement inappropriée dans ce cas. –

+0

Si une boucle infinie ne cède pas à la CPU, un temporisateur est le moyen le plus simple pour un apprenant C# de résoudre le problème. Il ne s'agit pas de retarder périodiquement - le but est de * céder *. L'auteur de la question essaye évidemment d'apprendre le C# en essayant de petites tâches - l'apprentissage du filetage à ce stade serait inapproprié. –