2011-10-22 11 views
2

私はSWTアプリケーションを持っています。私はSWTで私がやりたいことをやり遂げないことに苛立っていました。だから私はSwingを使いました。スイングは私の人生を楽にしました。わーい。それ以外は、2人が話をしなければならない。問題は、彼らが別のスレッドで実行されており、私はスイングからSWTのGUIメソッドを実行しようとするたびに、私は得る:SWT/Swing - >スレッドn 'Hell

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access 

ああ喜びを。だから、私はこれをどのように修正するのですか?これがObjective-Cなら、私は以下を使用できます:

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait 

しかし、そうではありません。スレッドBでメソッドAを実行する方法はありますか?そのスレッドが存在するときは?

答えて

4

私はSWTとはあまり働いていませんが、SWTは非UIスレッドでSWTオブジェクトにアクセスすることを厳しく禁止しているようです。 SWTのオブジェクトに対話する要求をキューに入れることができます。

Thisリンク例

これより良いあなたがsyncExec

display.syncExec(
    new Runnable() { 
    public void run(){ 
     label.setText(text); 
    } 
    }); 

これを使用することを示唆して説明し、私はメインのSWTのUIスレッド上でのRunnableをキューますので、アクセスは合法だろうと仮定することができます。

注:リンクをもう一度読んで、syncExecがSwing EDTをフリーズさせてしまいます。 syncExecを呼び出すと、RunnableがSWTキューにスローされ、完了するまで待機します。 asyncEventを見れば、キューに実行可能オブジェクトがスローされ、処理が続行されます。

+0

ありがとうございます!それは完全にトリックでした!同期と非同期に気づいた。私の目的のためにどちらがうまくいくかわからない、おそらく両方:D。 –