#author("2022-07-07T00:41:35+00:00","","")
#topicpath
----
**概要 [#t205e575]
プログレスバーを用いることで、進捗状況を表示したり、ユーザにキャンセルさせたりすることができるようになりました。しかし、このGUIの難点は処理が長いときは結局待たされてしまうということです。Eclipse2系の時は、仕事で使ってるとビルドで一時間以上Eclipseを占有されてしまうこともザラでした。

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

プラグインを自分で開発するときも、この機能を用いれば飛躍的にアプリの使い勝手がアップしそうです。が、ネットではほとんど情報を見つけることができませんでした。かろうじて
-[[On the Job: The Eclipse Jobs API:http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html]]

があるくらいです。

***やってみる [#n09016ee]
とりあえずいろいろ試してみました。基本的に、プログレスモニタとあんま変わらないかなあとあたりをつけて。。。。考慮しなくてはいけないポイントとしては、バックグラウンドで実行できちゃう(=ユーザが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();

#ref(job.png)

ちょっと感動です。マルチスレッドによる注意点とかはいろいろありそうですが、((ウィジェットがあるかどうかのチェックとかね))とりあえず、まいいでしょう。



----
この記事は
#vote(おもしろかった[18],そうでもない[1])
#vote(おもしろかった[19],そうでもない[1])
-Eclipse3.0のヘルプにもある程度情報がありますね。 -- [[きの]] &new{2005-05-13 17:15:34 (金)};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS