問題タブ [swingworker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
505 参照

java - あるSwingWorkerを別のSwingWorker内で実行できますか?

2つ実行する必要がありますSwingWorker。それらの1つは、もう1つが実行された後にのみ実行できます。このように実行できますか?

そして、どのようにそれらをキャンセルする必要がありますか?このような?

どうもありがとう!

0 投票する
2 に答える
1286 参照

java - EDT問題からのJavaスイングプログレスバー

これは、そこにいるスイングの専門家のためのものです。私はこの問題にかなりの時間を費やしてきたので、問題を説明するのに数行かかります。

スタンドアロンのJavaSwingアプリケーション(Java 6)があります。私のアプリケーションでは、ラジオボタングループのあるフレームがあります。グループ内のすべてのボタンにリンクされた単一のアクションがあります。このアクションは、どのラジオボタンが選択されているかを確認し、いくつかの作業を実行します。「作業」には、バックグラウンドの計算と、アプリケーション内の他の2つのフレームでのペイントが含まれます。バックグラウンド計算はマルチスレッドです。

ユーザーがラジオボタンの1つを選択すると、プログレスバーを表示したいと思います。ただし、ラジオボタンが選択されている場合、ラジオボタンへのアクションが発生している間は、進行状況バーは表示されません。jdialogタイプのプログレスバーやガラス板などを試しましたが、「作業」がすべて完了するまで表示されません。これは、対応するアクションの「作業」が完了するまで、Swingがラジオボタンのペイントを終了しないためと思われます。また、EDTは一度に1つのことしか実行しないため、プログレスバーダイアログ(またはガラスペイン)が表示されることはありません。

次に、SwingWorkerを使用してこのすべての「作業」を実行しようとしました。SwingWorkerのdone()メソッドでプログレスバーを起動(またはガラスペインをアクティブ化)し、SwingWorkerを起動してプログレスバーを閉じます(またはガラスペインを非アクティブ化します)。これでプログレスバーは正常に表示されるようですが、「作業」の一部であるペイントが完了せず、ペイントのアーティファクトが残ることがあります(paintComponentメソッドはかなり複雑なので、ここで再現したくありません)。ウィンドウのサイズを変更すると、アーティファクトが消えます。実際、これは、SwingWorkerの代わりにThreadを拡張するクラスを使用した場合にも発生します。これはすべて、Swingがスレッドセーフではなく、EDT以外のスレッドからGUI作業を実行しようとしているためです。私はその部分を理解しています。

私は何をしますか?「作業」には約30秒かかりますが、プログラムが機能していることをユーザーに示すことなく、それを行うには長すぎるようです。また、カーソルを待機カーソルに変更しようとしましたが、上記と同じ問題が発生しました。私にできることは、フレームを無効にして、フレームのタイトルを「working...」のようなテキストに設定することだけです。

誰かが以前にこの問題を見ましたか?

0 投票する
3 に答える
2690 参照

java - キャンセルされた未来が実際に終わるのを待っている

SwingWorkerスレッドの中断をチェックしないコードを呼び出す があります。の呼び出し後worker.cancel(true)worker.get()メソッドはすぐにスローCancellationExceptionします (想定どおり)。ただし、バックグラウンド タスクのコードは、そのスレッドが中断されるかどうかを決してチェックしないため、喜んで実行を継続します。

バックグラウンド タスクが実際に終了するまで待機する標準的な方法はありますか? 「キャンセル中...」メッセージまたはそのようなものを表示して、タスクが終了するまでブロックしたいと考えています。(必要に応じて、他の解決策を探すだけで、ワーカー クラスのフラグを使用して常にこれを達成できると確信しています。)

0 投票する
3 に答える
2214 参照

java - 並行していない Swing ワーカースレッド

12 個の Swing Worker スレッドをインスタンス化すると、最初の 6 個がそのタスクを完了し始め、それが終了してから、最後の 6 個が開始して終了するようです。私が探している動作は、12 個のスレッドすべてが同時に動作を開始し、同時に終了することです。

私は次のものを持っています:

myTask m は、進行状況バーを 0 から 100 まで 25 ずつ増分します。最初の 6 つのスレッドが増分を開始し、100 で終了し、最後の 6 つのスレッドが 0 から開始して増分し、終了するという異常な動作が発生します。

Swing Worker スレッドの量に制限要因はありますか?

0 投票する
2 に答える
1358 参照

java - Swing/SwingWorker 初心者の質問

Java で GUI を実装しようとしていますが、swing の初心者です。はっきりさせておきたいことがあります。GUI の応答性を維持するには、SwingWorker クラスを使用して別のスレッドでタスクを実行する必要があることを読みました。わかりました。いいえ、リモート メソッドである約 15 のメソッドを含むモデルがあります。各メソッドは、結果として、他のメソッドとは異なるオブジェクト タイプを返します。私の見解では、ユーザーがボタンを押すと、モデル内の適切なメソッドが呼び出されます。swingworker を使用しないと、GUI がフリーズしました。私の質問は、Swingworker スレッドの 15 のサブクラスを作成し、ユーザーのアクションに従って、必要に応じてそれぞれの新しいインスタンスを作成することになっているのでしょうか? 私の理解は正しいですか?これには標準的な方法がありますか、それとも私が言うことは正しいアプローチですか?

ありがとう!

0 投票する
1 に答える
480 参照

java - スレッドの閉じ込め/swingworkers

スレッドの制限については明確ではありません。Swing では、すべての GUI コンポーネントを EDT を通じて更新する必要があります。SwingWorker は長時間の操作のために Java6 で提供されており、done メソッドで GUI コンポーネントを更新できます。私の理解では、done() メソッドの GUI コンポーネントは EDT で更新されます。したがって、同期の問題は発生しません。しかし、ここにリンクテキスト

それは言います:

ImageRetriever クラスは画像をダウンロードして大きなラベルに配置するため、コンストラクターでラベルと画像の URL を指定すると便利です。ImageRetriever には、画像を取得するための URL が必要です。ImageRetriever インスタンスがラベルのアイコン自体を設定できるように、ラベルを提供します。内部クラスを使用する場合、ワーカー スレッドが情報に直接アクセスできるため、コンストラクターでこの情報を提供することさえできない場合があります。ただし、コンストラクターで情報を提供すると、その情報が ImageRetriever インスタンス間で共有されないため、アプリケーションをよりスレッドセーフにするのに役立ちます。

私はこれについて混乱しています。SwingWorker メソッドが EDT の GUI コンポーネント (リンクの例では JLabel) を更新する場合、ImageRetriever(=SwingWorker) インスタンス間でそれらを共有しない方がスレッドセーフである理由は何ですか? 複数の SwingWorker があり、done() メソッドで同じコンポーネントを更新する場合、更新に同期プリミティブを使用する必要がありますか? 私は何か誤解していますか?スレッドの制限は、1 つのスレッドだけがすべてのアクションを実行することを意味しませんか? swingworkers はスレッドに制限されていませんか?

ありがとう

0 投票する
2 に答える
1283 参照

java - swingworkers によるバックグラウンド タスクがシーケンシャルになる

SwingWorkers を使用して GUI をレスポンシブにしています。しかし、私は次のことを理解できません: ユーザーがボタンを押したときに GUI から呼び出したいリモート メソッドがあります。ボタンのアクションの中にあります(問題のプレゼンテーションの略):

私の問題は、GUI は応答しているように見えますが、リモート メソッドへの実際の呼び出しは順次であり、並行していないことです。ネットワーク トレースでこれに気づき、メソッドがブロックされていると考えました。しかしその後、SwingWorkers がシーケンシャルに実行されているように見えることをトレースで確認しました。から

ログ 2010-09-06 16:58:22,962 [ SwingWorker-pool-4-thread-1 ] DEBUG --> 最初のリモート メソッド呼び出し

応答を受け取り、2 番目の swingworker が実行されます

2010-09-06 16:58:23,227 [ SwingWorker-pool-4-thread-1 ] DEBUG --> 2 番目のリモート メソッド呼び出し

なぜこうなった?ランダムなインターリーブだと思ったのですが、2 つのインスタンスが同じ名前であることに気付きました。Swing ワーカーはプールされていますか? これはランダムな動作ですか?2 つの同時呼び出しが表示されるべきではありませんか? それらが再利用されている場合、並列処理ではなく同時呼び出しを行うためにできることはありますか?

ありがとう

0 投票する
2 に答える
1768 参照

java - 動的データをリアルタイムで表示するためのアーキテクチャ

エグゼクティブサマリー: Swing を使用してリアルタイムでスレッドセーフな動的データを表示するには、どのような健全なアーキテクチャの選択肢がありますか?

詳細: 最近、マルチスレッドの自動取引プラットフォームを Java で作成しました。私が「プラットフォーム」と言うのは、仮想オブジェクトをサブクラス化することで、新しい複数のトレーディング プログラムを非常に簡単に実装できるようにしたからです。Swing アプリケーション、コンソール アプリケーションなどで使用できるように、取引コードをカプセル化しました。現在、Swing フロントエンドで実行しています。

私はユーザーではなく、Swing の乱用者だと思います。意図的ではありません。最新の GUI を開発し、それを動的データと統合するには、特別な考え方が必要ですが、これについてはまだ学んでいません。イベントディスパッチスレッドでのみ画面を更新するなど、非常に基本的なことを知っています。SingleFrameApplication(サブクラスから) メッセージを表示する方法は次のとおりです。

ここのデータ要素は

任意の数の「トレーダー」(個別のスレッド)がいつでもメッセージを送信している可能性があります。私が使用した他のタイプのデータ オブジェクトはConcurrentHashMap. 注文ログ、取引記録、価格などのデータを収集しています。したがって、ここで描こうとしている図は、時間依存データの膨大なコレクションであり、一度にすべてを表示するには多すぎます。

私が本当にやりたいことは、概要情報を表示し、ドリルダウンできるようにすることです。現在JTextAreas、いくつかの にメッセージとその他の情報を表示していますJTextFields。私はJCoolWhateverを読んで、そこにデータを詰め込むことができます。しかし、その道を歩み始める前に、他のアーキテクチャの選択について学びたいと思います。

方法 1 : SwingWorkers を使用してデータを取得し、サブクラス JWhateverに存在するデータを貼り付けます。FrameView

方法 2 : ???

...

欲しいもの:

(1) 合理的なモジュール性.. 私たちの夜を台無しにすることなく要素を追加/削除するのに十分

(2) 相互作用機能、特に非常に多くのデータがあるためのドリルダウン機能

ありがとう...動的データの複雑なセットのリアルタイム表示は興味深いテーマであり、良い議論ができることを願っています.

0 投票する
1 に答える
1596 参照

java - SwingWorkerを一時停止/再開する方法はありますか

JavaでSwingWorkerを一時停止/再開する方法はありますか?

0 投票する
4 に答える
7036 参照

java - SwingWorkerを複数回実行する

SwingWorkerサブクラスを複数回使用できるようにしたい。これは可能ですか?

私はjavadocを読みました:

SwingWorker一度だけ実行されるように設計されています。SwingWorker複数回実行しても、doInBackgroundメソッドが2回呼び出されることはありません。