7

これは StackOverflow に関する私の最初の質問です (英語で申し訳ありません)。私はできる限り問題を説明しようとします。

私は、アプリケーションの期間を知らせるプログレスバーを持っている前景の翡翠アプリケーションを備えたswtアプリケーションを持っています。この進行状況バーを更新するには、次を使用します。

if(Display.getCurrent() != null) {
    progress.run();
}
else {
   sShell.getDisplay().syncExec(progress);
}

進行状況は次のとおりです。

Runnable progress = new Runnable() {
    public void run () {
        if (progressBar.isDisposed ()) 
            return;
        int percentage= (numStep*100)/maxSteps;
        progressBar.setSelection(percentage);
        if (numStep >= maxSteps){
            label1.setText("The simulation has been completed.");
            button.setEnabled(true);
        }    
    }
};

このRunnableにかかる時間を分析しようとすると一定ですが、この行を分析するsSehll.getDisplay().syncExec(progress)と異なる時間(0msからXXXXmsまで)がかかります

私はこれを読みました

syncExec(Runnable runnable) は、現在のスレッド (ディスプレイのユーザー インターフェイス スレッドとは異なる場合) が runnable の終了を待機するようにします。

しかし、ランナブルは時定数です...

誰かが私を案内できますか?なぜ時々3分かかるのか、それ以外の時間がかかるのか理解できません。

ありがとう

4

2 に答える 2

3

SWT Display クラスには、syncExec と aSyncExec の 2 つのメソッドがあります。どちらも、何らかの方法で UI を更新したい UI スレッドではないスレッドがある場合に使用されます。基本的に、それらを呼び出すときは、UI スレッドに対して、機会があればやりたいことがあると言っているのです。そのため、UI スレッドは現在の作業を続行し、ある時点で、要求されたとおりに実行します。それがいつ行われるかは、その時点で UI スレッドが実行しなければならない他の作業によって常に異なります。

aSyncExec と syncExec の違いは、それを呼び出すコードが実行の終了を待つかどうかです。aSyncExec を呼び出すと、呼び出し元のスレッドで次のステートメントがすぐに実行されます。syncExec を呼び出すと、呼び出し元のスレッドは、UI スレッドが実際にコードを実行して戻るまで待機します。したがって、syncExec の実行にかかる時間を計測することで、run メソッドの実行にかかる時間だけでなく、UI スレッドが実際に実行を開始するまでの時間も計測します。

ここで syncExec を aSyncExec と入れ替えようとしないでください。aSyncExec の実行にかかる時間を測定すると、さらに高速であることがわかります。しかし、これは、UI スレッドに何かを実行するのにかかる時間ではなく、UI スレッドに何かを伝えるのにかかる時間だけを計測しているためです。

于 2010-03-04T15:30:33.180 に答える
1

Displayクラスのドキュメントによると、syncExec

次の妥当な機会に、ランナブルの run() メソッドがユーザー インターフェイス スレッドによって呼び出されるようにします。このメソッドを呼び出すスレッドは、ランナブルが完了するまで中断されます。runnable として null を指定すると、単純にユーザー インターフェイス スレッドが起動されます。

したがって、runメソッドは一定の時間で実行されますが、Displayオブジェクトは常にすぐに呼び出すとは限りません。

于 2010-03-04T13:33:37.140 に答える