スレッドを利用した分散処理
投稿日時 2015/05/04 00:46:26ゲストさん、こんにちは
高級アプリ製作の極意 ~WPF編~のお部屋へようこそ。
このお部屋では 第17章 の「 スレッドを利用した分散処理 」についてお話したいと思います。
アプリ製作において どうしても避けられないのは CPU負荷の高い処理 です。
たくさんのデータの中から検索したり、難しい計算を繰り返し行ったりするとCPUをたくさん使用することになります。
高級アプリは基本操作する人を待たせないことが要求されます
どうしても待ってもらう必要が出てきた時は「 処理を行っている状態を常に表示する 」や「 バックスレッドを使用して他の作業が出来るようにする 」などの対策が必要です。
バックスレッドは便利で表向きのUI操作とは別に自由に処理を行うことが出来ます
そして、スレッドの処理のタイミングで表向きのUIへ表示を反映させることが出来ます
バックスレッドをたくさん使用すればその分CPU負荷も上がるので全部スレッドを分ければ良いのかと聞かれたらそうではないので 本当に高負荷の処理に合わせて利用するのが好ましい 。
サンプルで実装しているスレッド処理は、「 Threadクラスを使用した高度なスレッド制御 」と「 Taskクラスを使用したシンプルなスレッド処理 」の2種類です
特に .Net framework 4.5から用意されたTaskクラスのスレッド処理は本当に実装が楽で扱いやすい 処理です
1分掛かるアプリがあってそこへ10行程度のTask分散処理を記述したところ10秒程度になったなんてこともあります
お仕事で200人以上の人が使うアプリとかをちょくちょく作る私は 特に処理速度は気を使っていますよ 。
仕事でも下の単純な計算式を周りの人にしっかり伝えています。
アプリ利用者の作業コスト =アプリによって待たされる時間
×人数
×使用頻度
待ち時間が1分で10人が1日に10回使用するとしたら100分の作業時間が掛かるわけで、10秒の待ち時間なら10分で済むわけです。
1日に平等にある作業時間を とりあえずで組んだへなちょこプログラムで浪費しないように ね
サンプルダウンロード
サンプルイメージ画像
解析用のボタンを2種類用意しました。
「解析」 のボタンはバックスレッドを使用しないので ボタンを押した瞬間から数分間、アプリの操作を一切受け付けません 。
「解析(スレッド)」 のボタンはバックスレッドを使用します。
バックスレッド処理のため処理中でも操作を行うことができます。
サンプルプログラムは2種類のスレッド処理を記述しています。
ソースコード内にマクロで機能の切り替えが出来るようになっていますのでUSE_THREADの定義を探して有効無効に切り替えてみて下さい。
サンプルの中では C言語向けのAPIをDLLから参照して呼び出しする少し高度な処理 も書いています。
独自制御のスレッド処理の場合はCPU割り当てもしたいことがあるので使用するCPU割り当てを行うための処理も参考になるかと思います。