2

我尝试制作简单的蛮力算法。它工作正常。但我正在看这个视频

http://www.youtube.com/watch?v=v2xwfiggRYk&feature=relmfu

(时间 10:30)正如您在 textbox2 中看到的那样,可能性发生了变化。但在我的程序中。我创建 1323 作为密码,然后当我点击暴力时,我等了 5 秒,在 textbox2 中得到 99999,在 textbox3 中得到 1323。为什么我看不到textbox2 中的数字流与视频一样吗?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    } 

    int a, b;

    private void button1_Click(object sender, EventArgs e)
    {
        a = Convert.ToInt16(textBox1.Text);
    }

    private void button2_Click_1(object sender, EventArgs e)
    {
        for (int i = 0; i < 100000; i++) 
        {
            textBox2.Text = "" + i;
            if (a == i) textBox3.Text = "" + i; 
        }
    }
}
4

2 回答 2

4

那是因为视频中的程序在单独的线程中运行暴力循环。

在您的程序中,循环在主线程中运行,因此只要它在运行,就没有线程监视所有用户界面更新发生的消息泵。

每当Text更改文本框的属性时,都会在消息队列中删除一条消息,需要重新绘制文本框以显示该值,但主线程正忙于运行循环并且不会对消息进行操作,直到循环完成。

于 2012-10-16T20:43:53.890 回答
3

在 Windows 窗体中,用户界面有一个线程,后面代码中的所有代码也在这个线程上处理,所以当它运行你的for循环时,它不会重新绘制屏幕中的更改。

解决此问题的方法是使用BackgroundWorker在单独的线程上进行处理,并允许用户界面线程将更改重新绘制到屏幕上。

关于您的代码示例的几点,您应该像这样声明您的字段:

public partial class Form1 : Form
{
    private int a;
    private int b;

    ...
}

你也应该给他们更有意义的名字!

此外,您应该.ToString()在 int 上使用该方法,而不是将其与空字符串连接来获取文本值。

textBox2.Text = i.ToString();
于 2012-10-16T20:44:41.743 回答