0

友達、これは私のコードです(以下)。値の変更がプログレス バーに反映されない理由がわかりません。

    void Code()
    {
        string key;
        for (int i = 0; i < 26; i++)
            for (int j = 0; j < 10; j++)
                for (int k = 0; k < 26; k++)
                    for (int l = 0; l < 10; l++)
                        for (int m = 0; m < 26; m++)
                        {
                            key = (char)(65 + i) + " " + j.ToString() + " " + (char)(65 + k) + " " + l.ToString() + " " + (char)(65 + m);
                            File.AppendAllText("D:\\Codes.txt", key + Environment.NewLine);
                            val = (i + 1) * (j + 1) * (k + 1) * (l + 1) * (m + 1);
                            MyProgressBar.Value = val;
                            MyProgressBar.Text = (val * 100 / 1757600).ToString() + "%";
                            if (val == 1757600)                                                                    
                                MessageBox.Show("Code generation completed");
                        }
    }

プログレス バーの値とテキスト プロパティは、For Load のときと同じままです。これで私を助けてください。貴重なご意見をお寄せいただきありがとうございます。. .

4

3 に答える 3

1

値を変更するたびに更新すると、UI がブロックされます。そして、この File.AppendAllText はコードの最も遅い部分です..コメントアウトすると、数秒で最後まで実行されます..すべてのコードを配列に保存してから、すべてを一度?これで少しは速くなると思います。

                    string[] key = new string[1757600];

            private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
            {
                int val = 0;
                for (int i = 0; i < 26; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        for (int k = 0; k < 26; k++)
                        {
                            for (int l = 0; l < 10; l++)
                            {
                                for (int m = 0; m < 26; m++)
                                {
                                    key[val] = (char) (65 + i) + " " + j.ToString() + " " + (char) (65 + k) + " " + l.ToString() + " " +
                                          (char) (65 + m);
                                    //File.AppendAllText("D:\\Codes.txt", key + Environment.NewLine);
                                    //val = (i + 1)*(j + 1)*(k + 1)*(l + 1)*(m + 1);
                                    val++;
                                }
                            }
                    backgroundWorker3.ReportProgress(val);
                        }
                    }
                }
            }

            private void backgroundWorker3_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                MyProgressBar.Value = e.ProgressPercentage;
                MyProgressBar.Text = e.ProgressPercentage.ToString() + "%";
                //if (e.ProgressPercentage == 1757600)
            }

            private void backgroundWorker3_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                File.WriteAllLines("D:\\Codes.txt", key);
                MessageBox.Show("Code generation completed");
            }

このコードは数秒しかかかりません;)

于 2012-11-14T08:36:46.923 に答える
1

コードが UI スレッドをブロックしているため、更新されません。UI スレッドに更新を指示するイベントを発生させる何らかのバックグラウンド スレッドを使用する必要があります。詳細については、Google の「バックグラウンド処理 c#」を参照してください。

于 2012-11-14T07:02:58.190 に答える
0

ProgressBar は 0 から 100 までの値を取ることができます

MyProgressBar.Value = (val * 100 / 1757600);
于 2012-11-14T07:05:31.910 に答える