2017-06-15 3 views
1

2つのテキストボックスに2つの異なる数字を表示するC#フォームを作成したいとします。
スタートボタンをクリックした後、両方の数値が同時にインクリメントを開始し、ゆっくりインクリメントしてインクリメントを確認し、停止ボタンをクリックするとインクリメントが停止するはずです。
両方のテキストボックスは、いずれの方法でも互いに関連していません。マルチスレッドを使用してテキストボックスをインクリメント

public partial class Form1 : Form 
{ 
    Thread t1 = new Thread(new ThreadStart(increment1)); 

    public static int fNumber = 0, sNumber = 0,flag = 0; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Start_Click(object sender, EventArgs e) 
    { 
     t1.Start(); 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 

    } 

    private void number1_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    public static void increment1() 
    { 
     Form1 frm = new Form1(); 
     for (int i = fNumber;i<1000;i++) 
     { 
      frm.number1.Text = Convert.ToString(i); 
     } 
    } 
} 
+0

何か試しましたか? ... 1秒ごとに数字が増えるのでしょうか? –

+2

あなたの質問を編集してコードを入力してください。コメントに入れないでください – DaImTo

+0

まず何かを試してみてください。他の人があなたのためにそれをコーディングするなら、プログラミングには面白いことはありません。目標については、タイマーを使用する方法があります。 –

答えて

0

Form1の新しいインスタンスを作成していますが間違っています。 Threadを開始した現在のForm1を使用してください。

は、呼び出しを必要とするかどうかを確認、安全対策のために

public partial class Form1 : Form 
{ 
    private Timer timer1; 

    public static int fNumber = 0, sNumber = 0,flag = 0; 
    public Form1() 
    { 
     timer1 = new Timer(); 
     timer1.Interval = 1000; 
     timer1.Tick += timer1_Tick; 
     InitializeComponent(); 
    } 

    private void Start_Click(object sender, EventArgs e) 
    { 
     timer1.Start(); 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
    } 

    private void number1_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     int i = 0; 
     int.TryParse(this.number1.Text, out i); 
     i++; 
     if(this.number1.InvokeRequired) 
     { 
      this.number1.BeginInvoke((MethodInvoker) delegate() 
      { 
       this.number1.Text = Convert.ToString(i); 
      });  
     } 
     else 
     { 
      this.number1.Text = Convert.ToString(i); 
     } 
    } 
} 

を試してみてください。 this.number1.Text = Convert.ToString(i);をこのコードブロックに置き換えてください。

if(this.number1.InvokeRequired) 
{ 
    this.number1.BeginInvoke((MethodInvoker) delegate() 
    { 
     this.number1.Text = Convert.ToString(i); 
    });  
} 
else 
{ 
    this.number1.Text = Convert.ToString(i); 
} 
+0

は、これが静的プロパティー – Ajay

+0

で無効であると示します。キーワード 'this'は、静的プロパティー、静的メソッド、または静的フィールド初期化子では無効です。 – Ajay

+0

@Ajay私の更新された答えを試してください。静的ではない 'increment1'がまだ定義されていないので、ビルドエラーを引き起こすので、コンストラクタの中で' Thread t1'の初期化を移動しました。 –

0
public void Increment1() 
{ 
    for (int i = fNumber;i<1000;i++) 
    { 
     number1.Text = Convert.ToString(i); 
     number2.Text = Convert.ToString(i); 
    } 
} 

そして、ちょうど一般的にスレッドの静的避けます。あなたのtextbosesにnumber1とnumber2という名前を付けた場合、これを使わずにテキストボックスに直接アクセスできます。静的メソッドでは、変数も静的である必要があります。そうしなければ、コンパイルエラーが発生します。

可視性のために、関数は最初の文字を大文字にする必要があります。したがって、変数から変数を簡単に区別することができます。

関連する問題