• ベストアンサー

C# 計算処理中に実行中ウィンドウを表示させたい。

アドバイスをお願いいたします。 やりたいこと: (1)メインウィンドウで「計算始めるボタン」を押す。 (2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。 (3)計算が終わると別ウィンドウが閉じる。 下記プログラムの不具合: 別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。 注意:  下記プログラムはAthlon3000+で1秒ほどかかります。 CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。 using System; using System.Drawing; using System.Windows.Forms; //メインウィンドウ public class MainForm : Form { private Button button; private Label label; public MainForm() { button = new Button(); button.Text = "計算GO!!"; button.Click += new System.EventHandler(button_click); label = new Label(); label.Location = new Point(50,50); label.Text = "メインウィンドウ!"; Controls.Add(button); Controls.Add(label); Text = "MainForm"; BackColor = Color.Blue; } static void Main() { Application.Run(new MainForm()); } //計算GOボタンをクリックした時の処理 private void button_click(object sender, System.EventArgs e) { double z; SubForm Sub = new SubForm(); Sub.Show(); //計算処理 for(int i=0; i<=500000000; i++) z = double.MaxValue * double.MinValue; Sub.Close(); MessageBox.Show("計算終了"); } } //計算中を通知するウィンドウ public class SubForm : Form { private Label label; public SubForm(){ label = new Label(); label.Text = "実行中!"; label.Location = new Point(50,50); Text = "計算中通知ウィンドウ"; BackColor = Color.Red; Controls.Add(label); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

このような場合はマルチスレッドにするのが常套手段だと思います。 例えば、ボタン押した時にウインドウを作成表示し、計算スレッドを起動。計算スレッドの終了時にウインドウを閉じるのような動作にします。 逆に、Formの方を新規のスレッドにする手もありますが。 WIN32 API呼び出すより楽です。 [HOWTO] Visual C# .NET を使用してスレッドを作成する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;815804 C#プログラミング入門 第7回:マルチスレッドプログラミング http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp

参考URL:
http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp
jyuzou
質問者

お礼

マルチスレッドにして解決できました。 回答どうもありがとうございました。

その他の回答 (1)

  • cma3atgoo
  • ベストアンサー率35% (32/90)
回答No.1

参考になれば

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html
jyuzou
質問者

お礼

回答どうもありがとうございました。 大変参考になりました。 ただ、お手軽に「Application.DoEvents();」を上記プログラムのfor文中に入れたらとんでもなく処理時間がかかるようになってしまいました。 バックグランドで重い処理をしていなくても遅いです。 ループ回数の多いプログラムには向かないかもしれません。 Win32 APIを使ったプログラムの紹介もあったのですが、当方知識ではちょっと勉強が必要で、まだ試していません。 でも大変参考になり、回答感謝しています。

関連するQ&A