TesProgressBar ( 2012/11/26 )時間のかかる処理を実行している間、プログレスバーを使用してどのくらい処理したかを示すことが重要です。プログレスバーを表示して進めるだけならスレッド化の必要はないのですが、処理をキャンセルできるようにするためにはスレッド化が必要になります。スレッド化しなくともできないわけではありませんが、処理が複雑で難しくなるのでお勧めしません。cocoaでのスレッド化は非常に簡単なのです。 サンプルコード(プロジェクト)を二つ用意しました。一つ目は時間のかかる処理がシングルスレッドで流れるもの。既存のプログラムにプログレスバーを追加したい場合はこちらですね。二つ目は時間のかかる処理を複数のスレッドで分割して処理する場合です。分割の仕方は処理内容によって効率的な方法を考えなければいけませんが、このサンプルコードは数値の範囲で別けただけなので非常にシンプルです。 どちらも NSProgressIndicator の値の変更はcocoa bindingで実行しています。またメニューは全く使用していません。 プロジェクトはXcode 4.4.1で作成していますが、4.4以降なら全く問題ないと思います。 1.TestProgressIndicator 時間のかかる処理をNSThreadでスレッド化しています。シングルスレッドを前提にプログレスバーの変更もスレッドの中から直接実行しています。 2.TestProgressIndicatorM NSOperation を使用して複数の処理を実行させています。複数のタスクが同時に動くので、タスクの中から直接プログレスバーを変更しようとすると、競合して結果が不正なものとなってしまいます。そのためperformSelectorOnMainThread:withObject:waitUntilDone: を利用してメインループの中でシリアルに処理させています。 ダウンロード testProgressBar.zip 162 kB キーワード プログレスバー、マルチスレッド, NSProgressIndicator, NSOperation, NSThread 品川地蔵(片柳由明) |