2011-07-01 16 views
3

本当に、別のSwingWorkerスレッドのためにロックされているGUIのロックを解除するのが難しいです。基本的に私のプログラムは何ですか?ウェブカメラを初期化してから、単一フレームをつかんでJLabelアイコンとして表示します(ボタンをクリックすると簡単に表示できますが、画像処理を連続して行うのは困難です) 。私は、このような結果を得ることを目指しています:SwingWorkerがGUIをロックする(失敗した)JLabelアイコン更新

グラブフレーム - それは>プロセス - JLabelののイメージアイコンとして>表示>を...グラブフレームを繰り返し> ...

をウェブカメラをストリーミングしている間、私は結果を必要とするので私はSwingWorker publishprocessを使用しました。私のコードでは、適切な連続フレームを取得することさえできないので、「処理部分」は含まれていません。一般的に私のバックグラウンドスレッドはキャンセルされない限り、決して終了しません(私は他の方法で行う必要がない限り、できるだけ早く最大フレーム数で画像を処理したいと考えています - 私は&プロセス10 + FPSを得ることを目指しているという事実のために悪い考えです)。私は連続した画像をC:\に保存するテストを行ったので、私のSwingWorkerスレッドはうまく動作していますが、うまくいきましたが、私のGUIはロックされていますが、少なくともスレッドが実行し、

  • なしJLabelのアイコン更新
  • ロックされたGUI

マイSwingWorkerのコードは:

private class FrameStream extends SwingWorker<Void, BufferedImage> { 
    @Override 
    protected Void doInBackground() throws InterruptedException{ 
     BufferedImage processedImage = null; 

     while (!isCancelled()) { 
      processedImage = getPIC_COLOR(player); 
      publish(processedImage); 

      Thread.sleep(5000); // i made such delay to check whether program is not "choking" with data, but its not the case, without this delay everthing is the same 
     }    
     return null; 
    } 

    @Override 
    protected void process(List<BufferedImage> mystuff) { 
     Iterator it = mystuff.iterator(); 

     while (it.hasNext()) { 
      img_field.setIcon(new ImageIcon(mystuff.get(mystuff.size()-1))); 
     } 
    } 

    @Override 
    protected void done() {    
     infoBAR.setText("FINISHED"); 
    } 
} 

私はそう必死私その

は、一般的に私は、2つの問題がありますチュートリアルに完全に基づいて私のコードを書き直した例:Flipperあなたはそれがばかげて似ていることがわかります。私のこれまでのすべての努力もGUIをロックしていたので、チュートリアルの方法で試してみましたが、うまくいかなかったのは残念です。私はそれを解決する手がかりがないので、デッドエンドで私はイム。あなたはそれがチュートリアル1とまったく同じように見えるので、私は助けに絶望的です。MY FULL CODE

助けてください、私自身でそれを解決することはできません。

+0

'jstack'(と' jps')を使ってコードがロックされている場所を見つけることをお勧めします。 –

答えて

4

私と少し違って見えるものは、あなたのプロセス方法です。むしろ最後の画像を指定するよりも、あなたがそうのようなすべての画像を反復処理したいかもしれません:

@Override 
    protected void process(List<BufferedImage> mystuff) { 
    for (BufferedImage bImage : mystuff) { 
     img_field.setIcon(new ImageIcon(bImage)); 
    } 
    } 

私は、これは大きな違いを生むだろうかどうかわからないんだけど、私は、これはプロセスが書かれるべきかであると信じています。別の考え方 - BufferedImagesが大きい場合は、バックグラウンドスレッドでImageIconを作成し、BufferedImageではなくImageIconを公開することをお勧めします。

+0

ええ、私は画像の順序に関する私のさらなる「関心事」でした。最初はすべての収集画像を処理したいと思っていましたが、私のプログラムはそれを高速に処理できないと思ったので、最後のものをつかんでしまいましたチュートリアルの例では、何もしません)。 ImageIcon - >良い点を出版することによると、おそらく私はそうするだろうが、今私の大きな関心事は、完全にイメージの更新なしでGUIをロックされています。 –

+0

INCREDIBLE、私meand serioulsy、私はいくつかのデバッグを行い、私は 'process'でロックされていることに気づいたので、私はすべての画像を収集しようとし、それは働いた!多分新しい画像がリストアップされるという問題があったのでしょうか?それにもかかわらず、あなたは私にそれを試してもらうようにインスピレーションを与えました。ありがとうございます、私は信じられないほど感謝しています。 –

+0

@Marian:あなたは大歓迎です。うれしかったよ!私があなたのコードで見ることができるのは間違った唯一のものだったので、それを変更しようとすると怪我をしないと思った。 –

3

何も問題として目立っていません。私は、さらにデバッグすることをお勧めします。

ループと処理方法を使用する代わりに、1つのフレームを引っ張り、アイコンを1回設定します。あなたはそれをループにしようとする前にそれを取得する必要があります。あなたのアプリケーションは、問題を強調しないという事実を示すアイコンを設定できるはずです。

第2に、GUIがロックアップしているため、EDTにはまだ何かが起こっています。 GUIがロックされている間に実行中のものを見つけるために、プロファイラを実行するか、コードにSystem.out.printlnを追加してみてください。

最後に、画像を表示させるためにラベルのコンテナを再確認する必要がないことを確認してください。

+0

1つのフレームを取得+ボタンで表示しても問題ありません。また、1つのフレームグラブとディスプレイ用のスレッドを作成します。私の目的は、ボタンのクリックを避けて、フレームを取得し、それを継続的に処理したいときに処理することです。 2番目: 'process'と' doInBackground'は継続的に実行されていますが、JLabelは更新されていません(前に述べたように - ローカルドライブにイメージを保存するための追加コードを作っています。 gui) –

+1

ok私はいくつかのデバッグを行い、最終的に問題を解決しました~~何とか私は 'process'でロックされました。問題は解決しました。助けを求めるすべての人に感謝します。 –

+0

@jzd:プロセスがループするはずです。なぜ私は分かりませんが、それはどのように動作するのですか。もしRob CamickやTrashGodがここにいたら、なぜ彼らが知っているだろうと確信しています。デバッグの提案は1+です。 :) –

1

うーむ、私はあなたのlast postはこの問題について、可能なミスの多分たくさん(と私はあなたのコードを参照)がある読んでいる場合は、それがSwingWorkerで行うには何もない、別のexampleは自分Icon or ImageIcon

JButton#setBackground()ための変更の色を置き換えます
+0

ええと、タイマーは、できるだけ早く画像処理をしたいときには非常に望ましくない遅延をするという事実から、私が避けたかったものですが、有用なのは –

+0

@Marian Paziochは 'Executor'から呼び出されたスレッドの数を慎重に扱っています。なぜならSwingWorkerはExecutorを気にせず、この無知によってトップ25にバグがあります:-)、実装された 'PropertyChangeListener'はそれをあなたに援助したり、expexed/non-expected/probableな問題を避けることができます... – mKorbel

0

ラベルを設定して画像アイコンを観察しようとしましたか?

icon.setImageObserver(label); 
関連する問題