2009-05-26 8 views
1

私は次のようにwhileループ内部のシリアルポートからデータを読んでいる:whileループの問題

while((len = this.getIn().read(buffer)) > 0) { 
    data = new String(buffer, 0, len); 
    System.out.println("data len " + len); 
    handleModemresponse(data); 
} 

をしかし、ストリームの開始からデータを読みながら、持っているメインAWTウィンドウ、接続解除ボタンは、リスナーを取得していません(ウィンドウ全体がリスナーを取得していません)。これは、転送が完了したとき、つまりwhileループの外側でのみリッスンします。

whileループ内にあるときに自分のアクションをリッスンするようにします。

どのように私はこれを達成することができますか?

答えて

1

転送中にAWTスレッドを束縛しないように、このループを別のスレッドにプッシュする必要があると思われます。

+0

@Pax:あなたの書式設定を消去、フォーマットのため申し訳ありません;)あなたはこの質問を言い換えでより良い仕事をしました。 – VonC

+0

私は編集を開始すると質問をよくすることについて肛門保持者であることが主な理由で、しばしば起こるprobs、@ VonCはありません。 – paxdiablo

4

すべてのスレッドが1つのスレッド内にあるように見えるため、作業中の処理中にGUIがブロックされたように見えて、ループが終了するまでアクションに応答しません。

GUIの出席を1つのスレッドで、作業方法を別のスレッドで分けなければなりません。

2

呼び出している読み取りメソッドがブロックしています。リスナーが機能し続けるためには、別のスレッドで移動する必要があります。

+0

より正確には、I/Oをブロックすることはここでは問題になりません。これは、問題を引き起こしているGUIスレッドで長時間実行されるプロセスです。 –

5

読み取りアクションのための新しいスレッドを作成します。

public class LongProcess implements Runnable { 
    public void startProcess() { 
    Thread t = new Thread(this); 
    t.start(); 
    } 

     public void run() { 
// Define inputstream here 
     while((len = inputStream.read(buffer)) > 0) { 
     data = new String(buffer, 0, len); 
     System.out.println("data len " + len); 
     handleModemresponse(data); 
     } 
     } 
    } 

EDIT(コメントトムホーティン後 - tackline):

SwingUtilities.invokeLater(new LongProcess()); 
+1

AWT EDTスレッドに戻るには、java.awt.EventQueue.invokeLaterを使用します。 –

+0

er ... invokeLaterは、スレッドが切り取られたときにGUIに通知するためのものです。 最後にrun()のようにします。 ... ies.invokeLater(new Runnable(){ ... public void run(){ gui.taskIsDone(結果); .... – KarlP

関連する問題