-4

mainFormhelperFormという名前の 2 つのフォームがあります。mainForm にはボタンがあり、helperForm には richTextBox があります。私がやりたいことは次のとおりです。mainForm のボタンがクリックされたら、helperForm とリッチテキスト ボックスにテキストを表示したいと思います。以下のコードでは、ヘルパー フォームを表示できますが、ボタンの後に来るテキストは、buttonClickイベント内のすべてのプロセスを終了します...

メインフォーム

public partial class Form : Form 
{
   public HelperForm helperForm;

   public MainForm()
   {
     InitializeComponent(); 
   }  

   public void button_Click(object sender, EventArgs e)
   {
     helperForm= new HelperForm ();
     helperForm.Show();    

     helperForm.richTextBox1.AppendText("Program started");

     //doing  process1  
     helperForm.richTextBox1.AppendText("Program start to check process1");

     //doing process2  
     helperForm.richTextBox1.AppendText("Program start to check process2");

     //doing process3  
     helperForm.richTextBox1.AppendText("Program start to check process3");

     //doing process2  
     helperForm.richTextBox1.AppendText("All the process are done!");

     helperForm.Close();
}
4

2 に答える 2

0

正しい解決策は、バックグラウンド スレッドを使用して「プログレス バー」タイプの表示を実現することです。これにより、UI がロックされなくなります。バックグラウンド スレッドから UI アクションを実行する場合は、それらのアクションを呼び出して例外を防ぐ必要があります。バックグラウンド スレッドから直接 UI を更新することはできません。

次のコードはあなたが望むことを行いますが、スレッド化、呼び出し、およびデリゲートについて読む必要があります。そうしないと意味がありません。あなたのコードをもっと見ることができれば、Application.DoEvents() を使用する方法があるかもしれませんが、コマンドを繰り返すのに適した場所を提供するループでより適切です。小さなユーティリティ プログラムを作成する場合を除き、私はバックグラウンド スレッドを好みます。

public partial class Form1 : Form
{
    private HelperForm helperForm;
    private Thread processRunner;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (processRunner == null || processRunner.ThreadState == ThreadState.Stopped)
        {
            helperForm = new HelperForm();
            helperForm.Show();

            processRunner = new Thread(new ThreadStart(runProcesses));
            processRunner.Start();
        }
    }

    private void runProcesses()
    {


        this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program started"); }));

        //represents  process1
        Thread.Sleep(2000);

        this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program start to check process1"); }));

        //represents process2  
        Thread.Sleep(2000);

        this.Invoke(new Action( () => { helperForm.richTextBox1.AppendText("Program start to check process2"); }));

        //represents process3  
        Thread.Sleep(2000);

        this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("Program start to check process3"); }));

        //represents process4  
        Thread.Sleep(2000);

        this.Invoke(new Action(() => { helperForm.richTextBox1.AppendText("All the process are done!"); }));

        // to let the message display
        Thread.Sleep(2000);

        helperForm.Invoke(new Action(() => { helperForm.Close(); }));
    }
}
于 2013-09-22T14:00:22.733 に答える