2017-06-15 58 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。在一个静态方法中,变量需要是静态的,否则你会得到一个编译错误。

对于可见性,函数应该有大写的首字母。所以你可以更容易地从变量中区分它们。