3

現在、私は常にSwingWorker実際の作業を行うためにを作成し、を介して出力を処理するために別のを作成していPipedReaderます。

この2つを組み合わせたいのですが、私の状況では、簡単な方法がわかりません。

私を考えると:

  1. 動作する既成のオブジェクトを用意します(converterこの場合は)
  2. converterGUIへの進行状況に関する更新を定期的に表示したい
  3. converterタスクを終了して戻るときにオブジェクトを受け取ります。

2人のSwingWorkerなしでこれを行う方法はありますか?

編集:converter拡張することSwingWorkerはオプションではないことに注意してください。

編集2:以下のコメントに応えて。これは、より大きなGUIアプリケーションの一部であり、大量のデータ(txtの形式)を処理し、何が間違っているか、または何が決定されたかをユーザーに通知します。

サンプルコード(純粋に例示的で、使用されていません):

//SwingWorker 1
@Override
protected Void doInBackground() {

   outputWorker.useInStream(new PipedReader(outStream));
   outputWorker.execute();
   converter.usePipedWriter(outStream);
   Output object2=converter.Convert(object1);

}

//SwingWorker 2
@Override
protected Void doInBackground() {

   while(inStream.hasNext()) {
      publish(inStream.next());
   }
}
4

2 に答える 2

2

1つまたは2つ使用する場合、あなたの質問に対する答えではありませんSwingWorker。これらのことを複雑にしたい...

@ user1291492 30 MB のテキスト ファイルを処理中

  • メソッドからの例外get()をリッスンする必要があります。特に@trashgodによる回答を読んでください

  • たとえば、10 ループごとにデータを GUI にパブリッシュすると、すぐに GUI に出力されProcessing 30 mb text filesます。Batch

  • duringBatchは S によって現在のスレッドを停止することが可能ですwingWorker#cancel();

于 2012-04-20T16:48:08.447 に答える
1

JDK7を使用している場合は、複数のSwingWorkerインスタンスをチェーンする代わりにSecondaryLoopを使用することを検討してください。

SecondaryLoopを使用すると、基本的に、SwingWorkerと同様に、EDTをブロックせずにバックグラウンドスレッド(または一連のスレッド)が完了するのを待つことができます。いずれの場合もSwingWorkerの代わりとしては適していない可能性がありますが、問題の説明からすると、これは使用できる可能性があると思われます。

このトピックの詳細については、関連する質問「SwingWorkerの代わりにSecondaryLoop? 」をご覧ください。

于 2012-04-23T17:00:17.683 に答える