2017-06-15 54 views
1

我想創建一個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

你嘗試過什麼嗎? ......這個數字應該每秒增加一次嗎? –

+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嘗試我更新的答案。移動了構造函數中'Thread t1'的初始化,因爲非靜態的'increment1'還沒有定義,這仍然會導致構建錯誤。 –

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

而只是籠統地避免靜電線程。如果您將textboses命名爲number1和number2,則可以直接訪問您的文本框,而無需使用單詞this。在一個靜態方法中,變量需要是靜態的,否則你會得到一個編譯錯誤。

對於可見性,函數應該有大寫的首字母。所以你可以更容易地從變量中區分它們。