Tips

進捗バーを表示させた時のパフォーマンス低下防止策

日付2014/04/18
ID14-003
バージョン13
プラットフォームWin, Mac

進捗バーはとても便利なコンポーネントですが、ループ中に進捗バーの更新を行うと処理のパフォーマンスが低下することがあります。進捗バーは別プロセスで動作するので、進捗バーの更新にはプロセス間通信が使われているからです。

プロセス間通信をループステップで毎回行うことは、好ましい結果を得られないかもしれません。そのような時には、適度な間隔で進捗バーを更新するテクニックを使います。

次の例題コードは、$i_intv変数にセットされた値によって、間隔を開けて進捗バーを更新しています。

//ループの回数
C_LONGINT($i_cnt;$i_max)
$i_max:=(Random%501)+100
//進捗バーを更新する間隔
C_LONGINT($i_intv)
$i_intv:=18

// // // // // // // // // // // // // // // // // // // // // // // // //

//進捗バーの表示準備
C_LONGINT($ref_bar)
$ref_bar:=Progress New 
Progress SET TITLE ($ref_bar;"ループ処理中")
Progress SET PROGRESS ($ref_bar;1/$i_max)
Progress SET MESSAGE ($ref_bar;"1/"+String($i_max)+" 実行中")

//ループ処理の開始
For ($i_cnt;1;$i_max)

//プロセス間通信を減らしつつ進捗バーを更新
If (($i_cnt%$i_intv)=0)
Progress SET PROGRESS ( $ref_bar ; $i_cnt/$i_max)
Progress SET MESSAGE ($ref_bar;String($i_cnt)+"/"+String($i_max)+" 実行中")
End if 

//何かの処理の代わりに待機
DELAY PROCESS(Current process;1)

End for 

//進捗バーの表示終了
Progress QUIT ($ref_bar)

関連資料