
こんにちわ。業務で行き詰ってしまい、アドバイスをいただきたく質問させていただきます。
稚拙な文章ですがご容赦くださいますようお願いいたします。
★プログラム構造
アプリケーションのメイン画面にテキストフィールドが配置されていて、
そのフィールドが空白の状態でエンターキーを押下するとポップアップでエラーを表示する。
エラーの表示は、JOptionPaneを継承したクラス内で、JDialogで表示している。
ただし、JDialogのタイトルバー上で右クリックをするとメニューバーが表示されてしまう。
この現象に対して、タイトルバーの部分をペイントすることにより、右クリックを防止しました。
ポップアップは移動できるため、マルチスレッド処理にし常にリペイントがかかるように製造。
★不具合
ところが運用にて、1ヶ月程度たつとメイン画面の動作が非常に遅いとのクレームが来たので
CPU使用率を調べてみたところ80%~90%ぐらいまで上昇していた。
画面上のオペレーションは、何もしてないのに80~90%から減少することはありませんでした。
メモリの使用率は大して使用しておりませんでした。
また発生するマシンはCPUが低スペックのもので発生しています。
メイン画面を再起動(JMの再起動)をすると現象が解消されるため、本アプリが原因と断定しました。
ところが、何が原因なのかがわかりません。
スレッド辺りが怪しいなぁとは思っておりますが。。
調査の切り口や、現象解消方法をご存知の方がいらっしゃいましたらご教授願いたく思います。
以下は環境です。
◎OS:UNIX(Solaris8)
◎JAVA:1.4.1_03
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
あとは、
「プロファイラ」使って
「CPUを消費している箇所」を探るしかない気がします・・・
この回答への補足
Swingのシングルスレッドルールに違反していることが判明しました。
(遅すぎますね・・・・。気づくのに。)
おそらくその影響かと思います。
とりあえずこの質問は締め切らせていただきます。
回答していただいた皆さんありがとうございました。
回答ありがとうございます。
プロファイラも
JavaBean、Eclipse両方試しましたが、特に問題点は見つかりませんでした。
No.3
- 回答日時:
切り口が変わってしまうのですが、
タイトルバーを出さないという制御方法です。
別クラスになりますが、
JFrameで
setUndecorated(true);
とすれば、タイトルバーがでません。
もしくは、親のJWindowクラスは元々タイトルバーがありません。
以前、タイトルを出したくないとお客さんから依頼を受けて、JWindowに変更しました。
JDialogに合わせるコーディングは必要ですが、スレッドは考える必要がなくなると思います。
ありがとうございます。
namida6000さんの教えていただいた方法は、似たような案を
代変案として提出済みです。
私が製造するのであれば、namida6000さんと同じような製造方法にするのですが、製造したのは、私ではないので・・・・。
ご意見ありがとうございます。
No.2
- 回答日時:
> マルチスレッド処理にし常にリペイントがかかるように製造。
どう見てもこの部分が原因に思えるのですが。
要するにエラーダイアログの所在を常に監視し、タイトルバーの部分を上で塗りつぶしていると。
それをマルチスレッドで無限ループさせているわけですね。
無限ループは何もしなくても非常にCPUパワーを消費します。
この部分の設計を考え直す必要があるでしょう。
# そもそも右クリックメニュー表示を禁止する必要があるのか?
回答ありがとうございます。
>要するにエラーダイアログの所在を常に監視し、タイトルバーの部分を上で塗りつぶしていると。
>それをマルチスレッドで無限ループさせているわけですね。
おっしゃるとおりです。
>無限ループは何もしなくても非常にCPUパワーを消費します。
勉強になります。
ただ、スレッドが停止・開放された場合はCPUの使用率が下がると思っておりますが、間違っていますでしょうか。
現状では、CPU使用率が減少しないのです。
>この部分の設計を考え直す必要があるでしょう。
すでに代変案は提出済みなのですが、原因究明を要請されていますので、調べている最中でございます。
># そもそも右クリックメニュー表示を禁止する必要があるのか?
客先からの要望なのです。。
No.1
- 回答日時:
スレッドがどんどん増えて、溜まっていってるのでは?
きちんと開放されてるでしょうか?
こちらが参考になるかと思いますが・・・。
参考URL:http://www.techscore.com/tech/J2SE/Thread/4-4.html
この回答への補足
すみません。もうひとつ気になってることがあります。
(1)からの処理は、staticなメソッド内で行っています。
そして、(2)のダイアログの表示に関しては、
dialog.show();
で、表示しています。
このメソッドは使用すべきではありません。との警告が表示されます。
これが関係ある可能性がありますか。
回答ありがとうございます。
参考URLも参照させていただきました。
しかし、参考URLに書いてある内容は行っておりました。
(1)スレッドをスタートさせてリペイントを繰り返す。
(2)ダイアログ(ペイントを行う元のダイアログ)を表示。
(3)OKボタンが押下され、制御が戻ってきたらスレッドを停止させる。
UNIXとWINDOWSでなにか相違点などあるのでしょうか。
現在デバックはWINDOWSで行っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
ブラウザのIDの調べ方が解りません
-
ページ遷移せずにjava部品を実...
-
ポップアップでウィンドウを表...
-
VBS/HTA:画面のサイズを取得す...
-
"+"文字が" (スペース)"に文字...
-
ブラウザ画面で、変更した値が...
-
Ctrl+F4を無効にしたい
-
Tomcatのセットアップ
-
JSPで画面を更新するには
-
ログインについて
-
親子画面での値の受け渡し方法
-
javascriptでセッションの削除...
-
このadidasの腕時計の時刻の設...
-
Formのデータが欠落することがある
-
JSPでsession変数が勝手に書き...
-
javascriptでセッションを取得
-
グローバルIPアドレスの変更タ...
-
フォーム上で押されたボタンに...
-
DVD鑑賞時、字幕を消すには??...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三菱GOTの画面切り替えについて
-
Java-jspの画面入力値保持について
-
C言語で今まで表示していた画面...
-
画面遷移を行わずに同一ページ...
-
ASP.NET 画面遷移前の状態を保...
-
MFCプログラミング
-
ボタンを押したあとに画像を表...
-
アドレスバーに引数を表示させ...
-
遷移元を判定したい!
-
C# ログイン画面からメイン画面...
-
Strutsのデータ受け渡しについて
-
ServletからServletへの値渡し
-
登録後、呼び出し元ページに戻...
-
検索画面→結果画面→検索画面と...
-
Strutsで画面遷移させない。
-
JSPから出力されたHTML画面のcl...
-
Beautiful Soupのインストール...
-
JAVAのセッション変数の上書き...
-
strutsで、JSP→アクションクラ...
-
ブラウザアドレスバーからのURL...
おすすめ情報