2016-12-29 10 views
1

私は現在、アルジノがrgb ledストリップに接続されたシリアルポートに100から355の値を送るプログラムを開発しています。JSliderプログラムがフリーズ

プログラムは少しうまく動作しますが、突然凍ってしまい、スライダを動かすことやボタンをクリックすることができません。

私は、スライダをゆっくり動かすと、この問題は頻繁に起こらないため、スライダによって起動されるイベントの量を減らす方法がわからないため、プログラムの処理が多すぎるためと考えています。ここで

は、スライダのための私のコードです:ここ

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     try { 
      output.flush(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

が私の新しいコードです:

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     new Thread(() -> Write(data)).start(); 
    } 
}); 

public static void Write(byte[] data){ 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

送信データがフリーズの原因ではない可能性があります。アプリケーションはSwingイベントスレッドのデータも受け取っていますか? –

+0

............................こんにちは? –

答えて

4

それはあなたの完全なプログラムなしで確かに言うのは難しいですが、あなたが読んでいる表示され、 ChangeListenerからデータを書き込む。

Event Dispatch Thread (EDT)が追加イベントを処理できない不定期の時間の読み書き操作ブロックです。 EDTをブロックすると、GUIがフリーズするように見えます。

読み取り/書き込み操作を処理する別のスレッドをスピンオフするか、SwingWorkerを使用してEDTをブロックしないようにしてください。

Minimal, Complete, and Verifiable exampleであなたのポストを更新し、私はあなたにいくつかのより具体的なガイダンスを提供しようとするでしょう)

+1

私は追加します:あなたのコードがイベントディスパッチスレッド上で実行されているかどうかを判断する必要がある場合は、javax.swing.SwingUtilities.isEventDispatchThreadを呼び出します。 –

+0

これは完全に私のポストを編集してくれてありがとう。 – DiamondShark286

関連する問題