0

警告: 私はまだ Eclipse プラグイン開発における適切な MVC に苦労しているので、私が耐えなければならないより多くの苦痛を引き起こしている可能性が最も高いものがここにある場合は、私に知らせてください。

質問:

JFace Tree Viewer と Table を含む View があります (Table Viewer ではありません... 今後変更される予定です)。

ビューへの参照で初期化されるアクションがあります (これはひどいようですが、正しい方法はまだわかりません)。ビューのボタンを介してアクションが実行されると、アクションは次のようになります。 1) ビューからツリー ビューアーを取得します。 2) 基礎となるモデルを取得します。 3) ジョブを作成します。モデルに子を追加するなど、さまざまなものがあります b) ビューで公開されている関数を使用して、ビュー内のテーブルを「クリア」します 4) 「done()」を実装する JobChangeListener を追加します。a) done() メソッド内で、次のコードを介してツリービューアーを展開します。

loadMethodsJob.addJobChangeListener(new JobChangeAdapter(){
        public void done(IJobChangeEvent event){
            view.enableActions();
            view.getTestsViewer().expandAll();
        }
    });

ジョブ内でビューアーの要素にアクセスしようとすると、無効なスレッド アクセス エラーが発生します。ジョブ内で実行しているときにそれらを取得する理由は理解していると思いますが、ジョブ変更リスナーでウィジェットを操作できない場合、それらを正しく回避する方法がわかりません。ウィジェットとのすべての対話を getDisplay().synchExec(....) でラップすれば機能させることができますが、これは好ましくないことを読んだことを覚えているようです。

私は Eclipse SWT の理解において大きな飛躍の瀬戸際にいるように感じているので、そこに到達するためのガイダンスに感謝します。

4

1 に答える 1

1

SWT のすべての UI コンポーネントは、UI スレッドによってのみアクセスできます。

ジョブの done メソッドは別の非 UI スレッドで実行されるため、無効なスレッド アクセスが発生します。

すべてのインタラクションを でラップすることによりDisplay.syncExec、表示スレッド (UI スレッド) で確実に実行されます。

上記のアプローチで問題はないはずです。

于 2010-05-18T09:24:42.107 に答える