Top / Eclipse / プラグイン開発のTIPS集 / バックグラウンドで実行する

概要

プログレスバーを用いることで、進捗状況を表示したり、ユーザにキャンセルさせたりすることができるようになりました。しかし、このGUIの難点は処理が長いときは結局待たされてしまうということです。Eclipse2系の時は、仕事で使ってるとビルドで一時間以上Eclipseを占有されてしまうこともザラでした。

さて、Eclipse3.0からはそのような事象に対応すべく「バックグラウンドで実行」する機能があります。Eclipse3.0からはこの機能が随所で使用されていて、ビルドなどの処理中もEclipseを並行して使用することができるようになりました。

プラグインを自分で開発するときも、この機能を用いれば飛躍的にアプリの使い勝手がアップしそうです。が、ネットではほとんど情報を見つけることができませんでした。かろうじて

があるくらいです。

やってみる

とりあえずいろいろ試してみました。基本的に、プログレスモニタとあんま変わらないかなあとあたりをつけて。。。。考慮しなくてはいけないポイントとしては、バックグラウンドで実行できちゃう(=ユーザがEclipseをさわってなんかやっちゃうかもしれない)ので、スレッドを意識しなくちゃいけないこと、くらい???

さて使い方ですが、必要なのは

  • org.eclipse.jface.operation.IRunnableWithProgress? のかわりにorg.eclipse.core.runtime.jobs.Jobを実装する
  • Job.schedule();を実行

みたいですね。Jobクラスはその名の通りジョブのオブジェクトで、別スレッドで実行したいジョブを実行します。実装するためのメソッドは

public IStatus run(IProgressMonitor monitor) {

です。

public IStatus run(IProgressMonitor monitor) {
  monitor.beginTask("「" + text + "」でGoogleを検索中...", 10);
  try {
    //スペルチェック開始
    monitor.subTask("スペルチェック");
    monitor.worked(1);
    なんか処理
    monitor.worked(3);
    //スペルチェック終了
    if (monitor.isCanceled()) {
        return Status.CANCEL_STATUS;
    }
    //検索開始
    monitor.subTask("検索中");
    なんか処理
    monitor.worked(3);
    //検索終了
  } catch (CoreException e) {
      return e.getStatus();
  }
  monitor.worked(10);
  monitor.done();
  
  return Status.OK_STATUS;
}

ようするに、プログレスモニタを使ったときの

  public void run(IProgressMonitor monitor)

とほとんど同じであることがわかりました。ただ、プログレスモニタはエラーやキャンセルなどステータスの通知を例外で行っていたのに対し、バックグラウンド実行の場合は返り値IStatusで行っています。

あとはこのJobクラスを実行するだけです。

Job job = new SearchJob("Google Search", text);
job.setUser(true);  // ダイアログを出す
job.schedule();
job.png

ちょっと感動です。マルチスレッドによる注意点とかはいろいろありそうですが、*1とりあえず、まいいでしょう。


この記事は

選択肢 投票
おもしろかった 18  
そうでもない 1  
  • Eclipse3.0のヘルプにもある程度情報がありますね。 -- きの? 2005-05-13 17:15:34 (金)

Top / Eclipse / プラグイン開発のTIPS集 / バックグラウンドで実行する

現在のアクセス:18892


*1 ウィジェットがあるかどうかのチェックとかね

添付ファイル: filejob.png 667件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-05 (月) 10:25:46 (530d)