2016年8月15日月曜日

C# プログレスダイアログ(進捗ダイアログ)の表示

世の中的にはたくさん情報があるが、備忘録をかねて、書く

プログレスダイアログの表示とはWindowsアプリケーションで、なんか重たい処理をした時に、進捗を表すためのFormである。
今時はWPFでやるべきだと思いつつ、まだ、Formアプリケーションを勉強中。

目標としては、以下を意識した

  • 進捗表示中にアプリケーションがフリーズしない
  • 進捗表示に数値情報を出して、あと、どれくらいで終わるかわかるようにする。
  • 今後も、別のアプリケーションで利用するように汎用性を持たせること



まず、僕が作ったProgressFormクラスをのせておきたいのだが、どうも上手く行かなかった。普通にのせるには容量多い。なんぞ、Gistという方法があるみたいなので、後日頑張ってのせる予定。多分、きっと。ぶっちゃけ、誰も見てないか。見てたら、コメントが無性にほしい。ほしがりさんですいません。どうでもいいか。


以下で、ひとまず、載せてもいないコードについて書く。

自分の作成した関数の中身

  • ポイントはまず表示をShow関数で行うこと。この時に、全ての初期化を行う。
  • 次にMessageプロパディを編集して、プログレスダイアログの表示を更新させる。これはクライアントのコードに記載する。この中で、Invokeも行っているので、更新がされないことは無い。
  • 最後に、Close関数で、プログレスダイアログを閉じる。これはfinallyから、呼び出すようにすると良い。
呼び出し側の重い箇所はTaskクラスで、スレッド化する必要がある。そうしないと、アプリケーションがフリーズしたように見えて、気持ち悪い。書き方は以下の感じ。間違ってたら、ごめん。ラムダ式便利。
Task.Run( () => { Console.WriteLine("test");} );

後、この処理ではプログレスダイアログを呼び出したフォームはEnableプロパディをfalseにすることで、操作できないようにしてある。これも最初はどうしたら良いかと迷った。。。
http://qiita.com/OneK/items/6ca3a71511cfe53caabc

これを作っていて、一番、混乱したのはスレッドの扱い方だった。進捗表示はGUIタスクの中で処理すべきかという話で、最初は別スレッドを作った。でも、結果として、GUI表示はGUIタスクの中にまとめて、重たい処理をTaskクラスで、別スレッドにするのが良いと感じた。今後も、その方針で行こうと決めれたのが良かった。


ひとまず、以上で!