本当に、別のSwingWorkerスレッドのためにロックされているGUIのロックを解除するのが難しいです。基本的に私のプログラムは何ですか?ウェブカメラを初期化してから、単一フレームをつかんでJLabelアイコンとして表示します(ボタンをクリックすると簡単に表示できますが、画像処理を連続して行うのは困難です) 。私は、このような結果を得ることを目指しています:SwingWorkerがGUIをロックする(失敗した)JLabelアイコン更新
グラブフレーム - それは>プロセス - JLabelののイメージアイコンとして>表示>を...グラブフレームを繰り返し> ...
をウェブカメラをストリーミングしている間、私は結果を必要とするので私はSwingWorker publish
とprocess
を使用しました。私のコードでは、適切な連続フレームを取得することさえできないので、「処理部分」は含まれていません。一般的に私のバックグラウンドスレッドはキャンセルされない限り、決して終了しません(私は他の方法で行う必要がない限り、できるだけ早く最大フレーム数で画像を処理したいと考えています - 私は&プロセス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
助けてください、私自身でそれを解決することはできません。
'jstack'(と' jps')を使ってコードがロックされている場所を見つけることをお勧めします。 –