2

どうやらEclipse / SWTがビジーマウスインジケーターを管理する方法はすべて

BusyIndicator.showWhile(Runnable synchronousStuffToDo)

ただし、私は基本的にイベント指向のプロジェクトを持っており、実行の連続行内で「やるべきこと」が発生しません。アクションが順序付けられ、継続コールバックが実行マネージャーに提供されます。したがって、そのランナブルに入れる意味はありませんsynchronousStuffToDo

低レベルで不器用ですが、ビジー インジケーターを非同期に操作するプラットフォームに依存しない別の方法はありますか?

ProgressMonitorDialog同じ問題に苦しんでいるように見えるので、この質問に追加する必要があります。はい、ProgressMonitorDialog#runメソッド内で内部イベント ループがスピンされますが、SWT イベント ループは私の実行マネージャーの 1 つにすぎないため、チェーンは引き続き切断されます。どうやら、このクラスがないと、下位レベルのプリミティブから再実装する場合を除いて、進行状況モニターを表示することさえできません。

4

3 に答える 3

0

私が現在取り組んでいる古い SWT アプリケーションで解決策を見つけました (これは特に好きではありませんが、機能します)。を使用しBusyIndicator#showWhile、内部で行う同期処理は次のとおりです。

  1. バックグラウンド スレッドで非同期タスクを開始する
  2. バックグラウンド スレッドが終了するのを待つループと同時に、SWT イベント ループを明示的にスピンします。
while (!taskDone){
    if (!display.readAndDispatch() && !shell.isDisposed()) {
        display.sleep();
    }
    taskDone = //check for task progress
    //update something on the main window status bar
}

これをよりクリーンなものに変換しようとしています(マルコが提案した行に沿って):

  1. ビジー アイコンを設定する
  2. バックグラウンド タスクの送信
  3. ビジー アイコンの設定を解除する

しかし、ステータスバーを更新するのに何が最適かはわかりません (バックグラウンドタスクは実際にはリモート呼び出しであるため、完了するまでスレッドがブロックされます)。バックグラウンド ジョブが実行されていることを検出し、それに応じてステータス バーを更新する専用スレッドを用意することを考えています (更新は展開中の点線であり、タスク固有のものは何もありません) が、このためだけにスレッドを使用するのは少し無駄に思えます.

于 2016-05-06T06:34:17.540 に答える
0

ランナブルはタスクの完了を待つ必要があります。例(ブラウザで書かれたコードはコンパイルされません - 私は例外を無視しています):

final Object condition = new Object();
BusyIndicator.showWhile(new Runnable() {
    public void run() {
        synchronized(condition) {
            while (!isMyTaskDoneFlag()) {
                condition.wait();
            }
        }
    }
});
doTask(new MyTask() {
    public void perform() {
        try {
            // Task logic
            ...
        } finally {
            // When done
            setMyTaskDoneFlag();
            synchronized(condition) {
                condition.notify();
            }
        }
    }
});

タスク内のすべてのコード パスで、ランナブルのブロックを解除することを忘れないようにしてください。進行状況モニターでもほぼ同じアプローチを使用できます。ランナブルを起動して、進行状況モニターの値を更新できます。

注: 待機中の runnable が SWT スレッドで実行されないようにする必要があります (たとえば、進行中のモニターを実行している場合に設定forkするtrue)。そうしないと、アプリケーションが応答しなくなります。

于 2013-06-14T23:36:39.047 に答える