Грубая сила - С#

Я пытался сделать простой алгоритм грубой силы. Он работает нормально. Но я смотрел это видео.

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

(время 10:30), как вы можете видеть в текстовом поле 2, возможности меняются. Но в моей программе. Я создаю 1323 в качестве пароля, а затем, когда я нажимаю перебор, я ждал 5 секунд и получаю 99999 в текстовом поле 2 и 1323 в текстовом поле 3. Почему я не вижу поток числа в текстовом поле2, как на видео?

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; 
        }
    }
}

person allstar    schedule 16.10.2012    source источник
comment
Вау, это странное место для объявления полей экземпляра...   -  person Jon Skeet    schedule 17.10.2012
comment
Вам нужно обновлять текст в текстовом поле каждый раз, когда вы его меняете, иначе он не будет отображаться. хотя не уверен как это делается   -  person Nabou    schedule 17.10.2012
comment
На самом деле это не имеет большого отношения к грубой силе, а не к правильной обработке обновления пользовательского интерфейса.   -  person myermian    schedule 17.10.2012


Ответы (2)


Это потому, что программа в видео выполняет цикл грубой силы в отдельном потоке.

В вашей программе цикл выполняется в основном потоке, поэтому, пока он работает, нет ни одного потока, наблюдающего за насосом сообщений, где происходят все обновления пользовательского интерфейса.

Всякий раз, когда свойство Text текстового поля изменяется, в очереди сообщений появляется сообщение о том, что текстовое поле необходимо перерисовать, чтобы отобразить значение, но основной поток занят выполнением цикла и не будет обрабатывать сообщения до тех пор, пока петля сделана.

person Guffa    schedule 16.10.2012

В формах Windows есть один поток для пользовательского интерфейса, и весь код в коде обрабатывается в этом потоке, поэтому, пока он выполняет ваш цикл for, он не перерисовывает изменения на экране.

Обойти это можно с помощью BackgroundWorker чтобы выполнить обработку в отдельном потоке и разрешить потоку пользовательского интерфейса перерисовывать изменения на экране.

Пара моментов о вашем примере кода, вы должны объявить свои поля следующим образом:

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

    ...
}

Вы также должны дать им более осмысленные имена!

Кроме того, вы должны использовать метод .ToString() для int вместо объединения его с пустой строкой для получения текстового значения.

textBox2.Text = i.ToString();
person Trevor Pilley    schedule 16.10.2012