1

サーバーとクライアントというチャット用のプログラムをいくつか作成しています。

どちらもSWTで作成されたGUIを備えています。サーバーは常に正常に動作します。

反対側では、クライアントのGUIはそうではありません。サーバーに接続すると、クライアントは接続されているクライアントについて質問し、サーバーはXメッセージ(名前ごとに1つずつ)で応答します。サーバーが実際に名前を送信し、クライアントがそれらを受信することを確認しました。

ただし、メッセージを受信した場合でも、GUIにメッセージが表示される場合と、表示されない場合があります。同じ実行でも、GUIに入れることができる名前とできない名前があります。

特にGUIを変更する方法に関しては、SWTの問題になる可能性があると思います。

ご想像のとおり、GUIを変更する場合でも、スレッドを使用しています。スレッドからGUIを変更したいので、メソッド「Display.asyncExec」を使用する必要があります。したがって、GUIで変更を行うたびに、次のようにします。

OurDisplay.asyncExec( new Runnable() {

    public void run()
    {

        MyText.append("#The user " + OurName + " has asked us about other clients\n");

    }

});

サーバーは同じものを使用しているので、どこで問題が発生する可能性があるのか​​わかりませんが、正常に動作します。

メイン(サーバーとクライアントの両方)プログラムで、作業しているウィンドウ(シェル)を閉じる前にプログラムの実行を終了しないために、この他のコードを使用していることに気付くかもしれません。

while (!ServerShell.isDisposed())
{
    if (!ourDisplay.readAndDispatch())
        ourDisplay.sleep();
}

何か案が?

ありがとう

-編集-コメントへの回答nº1-(コメントで回答することはできません。理由はわかりません)

私はしませんでした。スレッドにGUIの変更を待機させるために、「syncExec」メソッドを試してみました。ただし、これはどちらも機能しません。

ディスプレイキューの表示方法がわかりません。探しています。アイデアをありがとう。

そして、Runnableがスローする可能性のある例外をキャッチしようとします。ニュースを報告します。

4

1 に答える 1

0

いくつかの try/catch を作成すると、典型的な問題が表示されます: ビジー状態で GUI を更新しようとすることです。例外は、リッピングするまで抑制されます。

そこに Eclipse RCP アプリケーションがあると思います。GUI(UIJob)の更新にはEclipseジョブ処理をご利用ください。これは、これらの asyncExec(Runnable) 呼び出しよりも 1000 倍うまく機能します。これは、Eclipse フレームワークが GUI 更新のタイミングを計算するためです。

http://www.vogella.com/articles/EclipseJobs/article.html

Lars Vogel には、Job 処理に関する優れたチュートリアルがあります。

于 2013-01-09T12:37:39.017 に答える