• ベストアンサー

無限ループをわざと作って時計をつくりたい

無限ループをわざと作って時計を作ろうと思っています。 while(true){ 処理 } とすると無限ループを作ることができると書いてありましたので private void btnRedActionPerformed(java.awt.event.ActionEvent evt) { while(true) { taOutput.setText(""); Date d = new Date(); taOutput.append(d +":" ); Color c = new Color(102,255,255); taOutput.setBackground(c); Font f = new Font(Font.SERIF, Font.ITALIC, 25); taOutput.setFont(f);  } } として実行してボタンを押すと処理が止まって固まってしまうのです。 出力画面にOutOfMemoryErrorと書いてあるのでそのへんの理由だと思うのですが。 ちなみに for (int i = 0; i<5; i++) { } でテストするとうまく動きます。 これを固まらせずにうまく無限ループを続けさせるにはどうしたらいいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

無限ループを使用することについては意見が分かれるところかと思いますが、私は、ちゃんとThread.sleep(n)を呼び出してやれば、それほどCPUにも負担をかけないと思っています。まあ、javax.swing.Timerを使う方がスマートではありますが。 でも、メインスレッドの中で、無限ループを使うのは、やはり絶対に駄目です。理由はrinkunさんのおっしゃる通りです。 メインスレッドは一仕事終えて落ち着くまで、描画をしてくれないのです。 以下にThreadと無限ループを使った場合の例を挙げておきます。 import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class WhileTest extends JFrame implements ActionListener { JButton btn; JTextArea taOutput; public static void main(String[] args){ WhileTest f=new WhileTest(); f.setSize(400, 300); f.setVisible(true); } public WhileTest(){ Container cp=getContentPane(); cp.setLayout(new BorderLayout()); btn=new JButton("start"); btn.addActionListener(this); taOutput=new JTextArea(); cp.add(btn, BorderLayout.NORTH); cp.add(new JScrollPane(taOutput), BorderLayout.CENTER); } public void actionPerformed(ActionEvent evt) { TimerThread t=new TimerThread(); t.start(); } class TimerThread extends Thread{ public void run(){ while(true){ Date d = new Date(); taOutput.setText(d +":" ); try{ Thread.sleep(100); }catch(InterruptedException ex){ } } } } }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.4

> ちゃんとThread.sleep(n)を呼び出してやれば Thread.sleep()は、スレッドのスケジューリングを放棄しないから、厳しい条件ではだめですよ。javax.swing.Timerのソースコードを見ると、良い勉強になります。また、別スレッドからGUIのコードを呼ぶときは、やはり厳しい条件のときにはinvokeLater()やinvokeAndWait()をかませる必要があります。初心者も、そのことは知っておくべきです。

全文を見る
すると、全ての回答が全文表示されます。
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

javax.swig.Timerを使ってください。無限ループは、CPUのサイクルを浪費する極悪人です。ゼッタイに使ってはいけません。rinkun氏案の別スレッドも、無限ループの中で生成するのならノーグッド!です。

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/Timer.html
全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

画面の表示はどこで更新しているのかな? 通常、GUIフレームワークでの画面の更新などはコールバック・メソッド(btnRedActionPerformedなど)を抜けた後でフレームワークから画面更新メソッドを呼び出して行っています。 ところがコールバック・メソッドの中で無限ループしてしまうとコールバック・メソッドは終了せず、画面の更新などは一切されなくなってしまいます。 実際のところフレームワークは画面の更新だけでなく、イベント処理なども行っていますので、無限ループするならループの中で一連の処理を行わなければいけません。VBではイベント処理を呼び出すDoEventsがありますが、Javaでは知りません。基本的にはコールバック・メソッドの中では無限ループをしないことです。 どうしても無限ループ処理をしたい場合は、別スレッドを起動して行いましょう。そうすればコールバック・メソッドはスレッドを立ち上げてすぐに終わりますのでイベント処理には問題ありません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • RTOSの無限ループ

    itron等のRTOSではタスク登録すれば while(1){ 処理; } という無限ループを抜けられるじゃないですか? いったいどういう仕組みで抜けているのでしょうか? ソフト的にはどうあがいても無限ループなわけで・・。 どなたか教えてください。

  • jspで無限ループ

    jspやサーブレット、或いはaspのプログラムの中で無限ループになった場合、例えば while(true){ ・ ・ ・ } のように。 そのプロセスはどうなるのでしょうか? ブラウザを閉じた瞬間に止まるのでしょうか?

    • ベストアンサー
    • Java
  •  Javaのループ中のメモリの動きについて

     Javaのループ中のメモリの動きについて  以下のソースはテキストフィールドに文字列を張り付けると、特定の文字を置き換えて、カットするものです。 アクションイベント内で、無限ループをして待ち受ける処理をしていますが、メモリーが使われすぎてパソコンに負担がかかるのではと思っています。     見た目では影響ないようですし、カタカタ音はなりません。  しかし念のため数値でこれを把握したいです。  どのような測定方法があるかご存じの方がおられましたら教えてください。  (また、根本的にプログラムがNGであれば、ご指摘いただきたいです) public class test_1 extends Frame implements ActionListener { public static void main(String[] args) { new test_1(); } JTextField a = new JTextField(); JLabel b = new JLabel("Ctl + C", JLabel.CENTER); JButton b1 = new JButton(); String name; ClosingListener c = new ClosingListener(); public test_1() throws HeadlessException { super(); this.setTitle("日時の/と:を取り除く"); this.setSize(400, 150); this.addWindowListener(c); a.setFont(new Font("", Font.BOLD, 30)); a.setFocusable(true); a.putClientProperty("caretAspectRatio", Float.valueOf(0.3F)); a.setForeground(Color.cyan); a.setBackground(Color.yellow); b.setBackground(Color.white); b.setFont(new Font("", Font.BOLD, 30)); b.setPreferredSize(new Dimension(150, 150)); b1.addActionListener(this); this.add(a, BorderLayout.CENTER); this.add(b, BorderLayout.WEST); this.setVisible(true); b1.doClick(); } class ClosingListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public void actionPerformed(ActionEvent e) { while (true) { if ((a.getText().length() == 15) == true) {//文字の置き換え name = a.getText(); name = name.replaceAll("/", "_"); name = name.replaceAll(":", "_"); // name.substring(0, 16); System.out.println("name==" + name); a.setText(name); a.requestFocusInWindow(); a.selectAll(); a.cut(); } else if (a.getText().equals("")) {//空文字はスルー } else {//15文字以外はエラー JOptionPane.showConfirmDialog(this, "日時は**文字です。", "確認", JOptionPane.DEFAULT_OPTION); a.requestFocusInWindow(); a.selectAll(); a.cut(); } } } }

    • ベストアンサー
    • Java
  • UWSC 無限ループ

    UWSCで A.uws と B.uwsを無限ループさせたくて // 無限ループ While True Call A.uws // xxxx.uws 記録保存したスクリプト名 Call B.uws // xxxx.uws 記録保存したスクリプト名 Wend と記述したのですが、A.uwsは読み込まれたのですがB.uwsが読み込まれません。 具体的に、どこがどうおかしいか、このスクリプトでは出来ない場合、実際に両方を無限ループさせたい場合どう記述すれば良いのか教えて下さい。

  • for文while文の無限ループの違いについて

    for文の無限ループ for(; ;) と、 while文の無限ループ while(1) は、 どのように違うのですか? 処理速度やCPU負荷を考慮して、 どちらを使用するか悩んでいます。 よろしくお願いします。

  • 無限ループからの脱出

    import java.io.*; public class Test { public static void main(String[] args) throws IOException { String ss; int idt; while(true) { try { BufferedReader f = new BufferedReader(new InputStreamReader(System.in)); System.out.print("数字を入力してください : "); ss = f.readLine(); if(ss == "end") break; idt = Integer.parseInt(ss); System.out.println("あなたの入力した数字は " + idt + " です。"); System.out.println(); } catch(NumberFormatException e) { System.out.println("error : " + e); System.out.println(); } } } } 上記は、コンソールに入力した数字をそのまま出力し、数字以外を入力すると例外処理するプログラムです。 見ていただくと分かるとおり、途中入力したものが「end」だとbreakして無限ループを脱出するということを予定して作りました。 しかしbreakしてくれません。if文の中に処理が移っていないのです。なぜでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaの配列について。

    javaのプログラミングについてなのですが、配列を利用して、 画像イメージ zu0.jpg,zu1.jpg,zu2,jpgをウィンドウズアプリケーションで 3つ縦に並べて表示させ、ページ上部にタイトルを入れろという課題が出たのですが、 なかなかうまいきません。原因がわからないので質問させていただきます。 どうかお力添えお願いいたします。 ↓↓プログラム文↓↓ import java.awt.*; class PictF extends Frame{ Font f; Image im; PictF(){ setBackground(new Color(200,255,255)); f=new Font("Dialog",Font.ITALIC,36); Image[] im=new Image[3]; for(int i=0;i<im.length;i++) im[i]=Toolkit.getDefaultToolkit().getImage("zu"+i+".jpg"); setTitle("image"); setSize(400,700); } public void paint(Graphics g){ Image[] im=new Image[3]; for(int i=0;i<im.length;i++) g.drawImage(im[0],10,10,this); g.drawImage(im[1],10,100,this); g.drawImage(im[2],10,210,this); g.setFont(f); g.setColor(Color.blue); g.drawString("Ikeda Auditorium",100,240); } public static void main(String[] args){ PictF pf=new PictF(); pf.setVisible(true); } }

    • ベストアンサー
    • Java
  • 無限ループの防ぐ方法

    いつもお世話になっております、While文、for文などで 無限ループが発生した場合の良い対応方法を教えて教えて いただけないでしょうか? 最小限で且つ最速な変更が 一番助かります。 ------------------------------------------------------- 【例】 for(;;){ if(iNum == 10) break; } この場合だと、iNumが10になるまで抜けない為 無限ループになりPCがフリーズしてしまいます。 ------------------------------------------------------- 【対応】 【例】 for(;;){ if(iNum == 10) break; delay(1); } 一番簡単な対応だと、delay1を入れる事により PCのフリーズが防げると思います。ですが、delay1を入れる 事により処理が重くなってしまいます。 ------------------------------------------------------- そこで教えていただきたいのは、PCがフリーズさせない ような処理は他にないでしょうか? そのような関数が100ほどあるので、出来るだけ最小限な 改造で薦めたいと思っています。 以上です。

  • 無限ループについて(while true~)

    たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

  • 無限ループ中におけるマウスイベント処理について

    import java.awt.*; import java.awt.event.*; //他のインポートは省略。 public class Test extends Frame {  public static void main(String[] args) {   new Test();  }  public Test() {   //フレームの基本設定は省略。   enableEvents(AWTEvent.MOUSE_EVENT_MASK);   show();   mainLoop();  }  private void mainLoop() {   while(true) {    //処理は省略。   }  }  public void processMouseEvent(MouseEvent e) {   //処理は省略。  }  //他のメソッドは省略。 } こんな感じのプログラムを作ったのですが、mainLoop メソッドの無限ループにはまって何もできなくなるはずが、 なぜか普通にマウスイベント処理ができたので不思議に思っております。 VB などで同じようなプログラムを作るときは無限ループの最後に DoEvents でイベント処理をさせております。 言語仕様なのか自分の使ってる PC や OS など環境のせいなのが気になっております。 Java 言語に詳しい方、もし何かご存知でしたら教えて下さい。 (なお、省略した部分は普通の計算処理とかなので影響はないと思われます。)

    • ベストアンサー
    • Java
このQ&Aのポイント
  • らくちんプリント2.0で作ったデータを呼び出す方法について教えてください。
  • らくちんプリント2.0で作成したデータを3.0で編集したいです。方法を教えてください。
  • この質問はエレコム株式会社の製品に関するものです。
回答を見る

専門家に質問してみよう