2

単純なブルートフォースアルゴリズムを作ってみました。普通に動いていますが、このビデオを見ていました。

http://www.youtube.com/watch?v=v2xwficgRYk&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 に答える