2011-07-12 6 views
1

eclipse rcp:バックグラウンドでジョブを実行中にUIをブロックする方法

ダイアログにテストボタンがあります。ユーザーがそのボタンをクリックすると、アプリケーションはJDBC経由でデータベースに接続しようとします。

いくつかのテストケースでは、このジョブは、ユーザー、ネットワーク接続のタイムアウトなどに応答するのに時間がかかります。私はそのボタンにリスナーを付け、そのリスナーのデータベースに接続することでこれを行います。接続すると、接続ジョブが終了するまでユーザーインターフェイスは応答しません。接続中のユーザーアクションは、ジョブの接続後に有効になります。

例:このダイアログに別の「キャンセル」ボタンがあります。このボタンをクリックするとダイアログが閉じます。接続ジョブの実行中に「キャンセル」ボタンをクリックすると、接続ジョブが完了するまでダイアログは閉じられません!

は、私は私の接続ジョブが droped保存されていないと、後に有効になります実行している間、ユーザーのアクションが起こっ願っています。バックグラウンドでジョブを実行しながら、どのように起こったすべてのユーザーの行動を無視する
:私はWindows上で7


を日食藍を使用しています

私の質問はこれでなければなりません。

+1

Display.execSync()またはBusyIndi​​cator.show(Display、Runnable)が問題に対して有効な解決策ではない理由を説明してください。 –

+0

@Seven Displayy.execSync()が実行されている間にユーザーが「アプリケーションを閉じる」ボタンをクリックすると、Displayy.execSync()が完了したときにアプリケーションが終了しますが、「閉じるアプリケーション」アクションは無視されます。 – CaiNiaoCoder

答えて

0

swtにUIスレッドが1つだけ(他のほとんどのUIも)、プログラミング方法がUIをブロックします。

あなたの仕事は、それを行うために新しいスレッドを作成する必要がありますし、UIスレッドでこのような長期間の仕事をしないで、1.5でexecutor introductionを使用してください。

最もよい方法は、Eclipseのジョブメカニズムを使用することです。

最初のものは後に運転を開始する前shell.setEnabled(false)と​​を呼び出すことです:私は仕事はこれまでバックグラウンドで実行しながら、任意のユーザーアクションを無視することが分かっhttp://www.eclipse.org/articles/Article-Concurrency/jobs-api.html I

2

二つの方法:あなたがから学ぶ開始することができます操作が行われます。 (オプション)をBusyIndicatorと組み合わせると、ユーザーにいくつかのフィードバックが与えられます。

もう1つは、ユーザーが閉じることができないようにボタンがないモーダルダイアログを使用しています(例:SWT.APPLICATION_MODAL | SWT.SHEET | SWT.NO_TRIMなど)。このダイアログには、ラベル「Loading ...」またはProgressBarが保持されます。 RCPを使用する場合、ProgressMonitorDialogはオプションです。

私の場合、バックグラウンドジョブの実行時間を知ることができないので、2番目のソリューションを使いたくないです。ジョブが非常に短い場合、私はProgressMonitorDialogを素早く連続して開いて閉じるときに、ちらつきを避けたい。

@ screentiger.comジョブがバックグラウンドで実行されているときにユーザーの操作を無視する方法については、記事ではわかりませんでした。 もっと具体的で、コード例を挙げていただければ幸いです。

関連する問題