時間の掛かる処理を実行する

 - by Don

これは伺かアドベントカレンダー2012の11日目の記事です。

フリーズしたと誤解されないように

ゴーストで時間の掛かる重い処理をする必要がある時、どうすればいいでしょうか。10秒程度なら、まあ待っていてもいい気がします。でも1分以上となると、ユーザはフリーズしたものと判断し、SSPごと強制終了するかもしれません。

これを回避する策は2つほど思い付きますが、そのうちの1つを今日のネタにしたいと思います。

プログレスバーを表示する

SSPのネットワーク更新でも表示される、アレです。プログレスバーといいます。アレは現在の進捗状況が徐々に増えていくのが目に見えるので、フリーズしたという誤解を与えず、ユーザに安心感をもたらします。

ただ、ゴーストがそんな高度なことができるわけもないので、ちょっと小賢しい技を使います。

YAYAの例

重い処理(テキストファイルを読み込むなど)を100回行うことを想定します。素直に100回ループ処理で実行していたらしばらく固まってしまいます。

ExecHeavyProcess
{
  _tasks = ('a', 'b', 'c',...) // 100個
  for _i = 0; _i < ARRAYSIZE(_tasks); _i++ {
    ExecMyTask(_tasks[_i]) //重い処理
  }
}

なので、時々SSPに処理を戻さなければなりません。

ExecHeavyProcess
{
  grobal_count = 0
  '\![raise,OnExecutingHeavyProcess]'
}
OnExecutingHeavyProcess
{
  _tasks = ('a', 'b', 'c',...) // 100個
  for _i = grobal_count; _i < ARRAYSIZE(_tasks); _i++ {
    ExecMyTask(_tasks[_i]) //重い処理
    grobal_count++
    if grobal_count % 10 == 9 { // 10回に1回
      '\0 ' + grobal_count + '\![raise,OnExecutingHeavyProcess]' // 現在の進捗状況を表示
      return
    }
  }
}

10回に1回、進捗状況を表示し、\![raise]で次回も現在の処理の続きをするよう予約しておき、SSPに処理を戻します。若干苦しいですがユーザの不安を取り除くには有効な手段です。

もう一つ、正攻法としてマルチスレッドプログラミングによる解法がありますが、これはまた、別のお話。

No comments yet.