ホーム : 実験室 : TestProgressBar

TesProgressBar ( 2012/11/26 )

 時間のかかる処理を実行している間、プログレスバーを使用してどのくらい処理したかを示すことが重要です。プログレスバーを表示して進めるだけならスレッド化の必要はないのですが、処理をキャンセルできるようにするためにはスレッド化が必要になります。スレッド化しなくともできないわけではありませんが、処理が複雑で難しくなるのでお勧めしません。cocoaでのスレッド化は非常に簡単なのです。

 サンプルコード(プロジェクト)を二つ用意しました。一つ目は時間のかかる処理がシングルスレッドで流れるもの。既存のプログラムにプログレスバーを追加したい場合はこちらですね。二つ目は時間のかかる処理を複数のスレッドで分割して処理する場合です。分割の仕方は処理内容によって効率的な方法を考えなければいけませんが、このサンプルコードは数値の範囲で別けただけなので非常にシンプルです。

 どちらも NSProgressIndicator の値の変更はcocoa bindingで実行しています。またメニューは全く使用していません。 プロジェクトはXcode 4.4.1で作成していますが、4.4以降なら全く問題ないと思います。

1.TestProgressIndicator

 時間のかかる処理をNSThreadでスレッド化しています。シングルスレッドを前提にプログレスバーの変更もスレッドの中から直接実行しています。
 ループの中では0.1秒時間を浪費しているだけで、cpuも使用しません。10秒で処理が終了します。

2.TestProgressIndicatorM

 NSOperation を使用して複数の処理を実行させています。複数のタスクが同時に動くので、タスクの中から直接プログレスバーを変更しようとすると、競合して結果が不正なものとなってしまいます。そのためperformSelectorOnMainThread:withObject:waitUntilDone: を利用してメインループの中でシリアルに処理させています。
 処理内容は 1 から maxCount x step までの数値の平方根を計算してそれを累積し、最終結果をNSLog()で表示しています。maxCountのNSOperationに分割していますが、最大4個まで並行処理する設定にしてあります。アクティビティモニターで確認してください。

ダウンロード testProgressBar.zip 162 kB

キーワード プログレスバー、マルチスレッド, NSProgressIndicator, NSOperation, NSThread

品川地蔵(片柳由明)
http://www.jizoh.jp
©Copyright 2012, Yoshiaki Katayanagi