0

私はjavanoobプログラマーであり、SWT例外の無効なスレッドアクセスに問題があります。それを探しましたが、UIスレッドではないスレッドからインターフェイスアイテムを操作しようとすると発生することがわかりました。しかし、私はそれを修正する方法がわかりません。

問題: 4つのクラスがあります:

  • notify-notifyを表示するswtウィンドウを作成します
  • メインスレッド-ネットからコンテンツをダウンロードし、notifyクラスを使用すると通知が表示されます
  • ウィンドウ-トレイアイコン、設定が表示され、メインクラスです-メインスレッドを開始します
  • 2番目のswtウィンドウに通知を表示するクラス。

問題は、無効なスレッドアクセスでクラッシュすることです。2つのswtウィンドウ(完全に異なるクラス)を表示する方法がわかりません


そのアプリケーションはWebページをダウンロードし、それを解析して、必要な情報を取得します。次に、クラス通知を使用すると、通知が表示されます。SWTウィンドウであるクラスウィンドウを追加しました。トレイアイコンが表示されます。メインクラスでもある設定があり、そのクラスはZadaneReaderスレッドを実行します。最初の質問:他の方法でSWTウィンドウ(その主な目的はトレイアイコンと設定)を追加する必要がありますか?

私のアプリケーションには次のクラスが含まれています。

  • ZadaneReader-Webページをダウンロードして解析し、クラスNotifyを使用して、通知を表示します
  • 通知-そのクラスは2つの方法で通知を表示します:a)exec notify-sendを使用します(ただし、その方法でのみUbuntuです)b)通知を表示する2番目のSWTウィンドウであるオブジェクトUniNotifyWindowを作成します
  • UniNotifyWindow-独自の通知を表示するswtウィンドウ
  • ウィンドウ-設定、トレイアイコン、スレッドを開始した時点のメインクラスとZadaneReaderスレッド

現時点では、UniNotifyWindowを使用していない場合、またはWindowを使用していない場合に機能します(テスタークラスでZadaneスレッドを開始します)。

当たり前の質問だと思いますし、多くの間違いを犯しましたが、私を責めないでほしいのですが、私が間違っていることを教えていただければ幸いです。

ソース: https ://docs.google.com/open?id = 0B5VL4J_7HrgaTkt4a1Q2VVQxZEE

4

1 に答える 1

2

SWT UI要素には、メイン(別名「表示」)スレッドからのみアクセスできます。これは、別のスレッドのテキストボックスにテキストを設定するほど多くのことができないことを意味します。スレッドを表示するために作業をプッシュする最も簡単な方法は、

Display.getDefault().asyncExec(...)

表示スレッドで実行する内容は個別にする必要があることに注意してください。タスクを長時間実行すると、UIが応答しなくなります。

于 2012-10-25T19:51:21.480 に答える