سؤال

ممكن مكررة:
كيف يمكنني البدء في تحسين بلدي جافا رمز ؟ - وحدة المعالجة المركزية بنسبة 100%

لدي طريقة isReset() أن تنفيذ مثل مجنون أنا بأنه

   public boolean isReset() { return reset; 
   }

في فئة أخرى.فئة أدناه هي الطبقة الوحيدة التي تستخدم هذا الرمز.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;


// TimerQueue

public class SkaTest {
   public static final int WIDTH = 500;
   public static final int HEIGHT = 500;
   public static final int CANVAS_X = 100;
   public static final int CANVAS_Y = 100;
   public static final int CANVAS_FRAME_WIDTH = WIDTH+100;
   public static final int CANVAS_FRAME_HEIGHT = HEIGHT + 100;
   public static final int EXEC_WIDTH = 550;
   public static final int EXEC_HEIGHT = 400;

   static VizDSList dsList = new VizDSList();
   static SkaCanvas canvas = new SkaCanvas(dsList);
   static JFrame canvasFrame = new JFrame("Data Structure Canvas");
   static JMenuBar menuBar = new JMenuBar();
   static JMenu algorithmMenu = new JMenu("Algorithm");
   static JMenu dsMenu = new JMenu("Create");
   static JMenu helpMenu = new JMenu ("Help");
   static JLabel status = new JLabel(" ");   

   static SkaProgram[] alg;
   static JFrame execFrame[];
   static SkaExecutionPanel execPanel[];


   public static void setupFrames(int nAlgs) {
      int i; 

      for (i=0; i < nAlgs; i++) {
         // execFrame[i] = new JFrame("Execution Control Panel "+(i+1));
         execFrame[i] = new JFrame();
         execPanel[i] = new SkaExecutionPanel(execFrame[i]);
      }

      canvas.setMinimumSize(new Dimension(WIDTH, HEIGHT));
      canvasFrame.setSize(CANVAS_FRAME_WIDTH, CANVAS_FRAME_WIDTH);
      canvasFrame.getContentPane().setLayout(new BorderLayout(10,7));
      // canvasFrame.getContentPane().setPreferredSize(new Dimension(WIDTH, HEIGHT));
      canvasFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            System.exit(0);
         }
      });
      // canvas.setMinimumSize(new Dimension(WIDTH, HEIGHT));

      for (i=0; i < nAlgs; i++) {
         execFrame[i].setSize(EXEC_WIDTH, EXEC_HEIGHT);
         // execFrame[i].getContentPane().setLayout(new BorderLayout(10,7));
         execFrame[i].addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
               System.exit(0);
            }
         });
         execPanel[i].setBorder(new SoftBevelBorder(BevelBorder.RAISED));
         // execFrame[i].setContentPane(execPanel[i]);
         execFrame[i].getContentPane().add("Center", execPanel[i]);
         // execFrame[i].setLocation(CANVAS_X +CANVAS_FRAME_WIDTH, CANVAS_Y + i*EXEC_HEIGHT);
         execFrame[i].setLocation(CANVAS_X +CANVAS_FRAME_WIDTH + i*30, CANVAS_Y + i*50);
      }

      canvas.setBorder(new SoftBevelBorder(BevelBorder.RAISED));
      canvasFrame.getContentPane().add("Center", new JScrollPane(canvas) );
      // canvasFrame.getContentPane().add("Center", new JScrollPane(canvas, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) );
      canvasFrame.getContentPane().add("South", status);
      canvasFrame.setLocation(CANVAS_X, CANVAS_Y);

      JMenu fileMenu = new JMenu("File");
      JMenuItem quitItem = new JMenuItem("Quit");
      //TODO Add quit listener
      quitItem.addActionListener(new ActionListener ()
      {


        public void actionPerformed(ActionEvent arg0) {
            //System.exit(0);

            int again = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit system", "Exiting", JOptionPane.YES_NO_OPTION);
            if (again == JOptionPane.YES_OPTION)
            {
                System.exit(0);
            }


        }

      }
      );
      fileMenu.add(quitItem);
      menuBar.add(fileMenu);
      menuBar.add(algorithmMenu);
     // menuBar.add(dsMenu);
      menuBar.add(helpMenu);
      JMenuItem help = new JMenuItem ("Help Contents");
      //help.setMnemonic(KeyEvent.VK_H);
      //TODO Fix this method
      help.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ActionEvent.CTRL_MASK));
      help.addActionListener(new ActionListener()
      {
/*
        @Override
        public void actionPerformed(ActionEvent arg0) {
            JOptionPane.showMessageDialog(null, "Alot of the functionality have not yet been included in this version\nCurrently working on the automation features now!", "SKA 0.2 Beta", JOptionPane.WARNING_MESSAGE);

        }
*/

        public void actionPerformed(ActionEvent arg0) {
            try {
                Runtime.getRuntime().exec("hh.exe C:/ska.chm");
            } catch (IOException e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "File not found", "Error", JOptionPane.ERROR_MESSAGE);
            }


        }

      });
      JMenuItem about = new JMenuItem ("About SKA");
      about.addActionListener(new ActionListener(){


        public void actionPerformed(ActionEvent arg0) {
        JOptionPane.showMessageDialog(null, "SKA Version 0.1 Beta");

        }
    });
      helpMenu.add(help);
      helpMenu.add(about);
      canvasFrame.setJMenuBar(menuBar);
   }

   /** The create menu item  */
   public static void createProgram(int i) {
      JMenuItem algItem;
      switch (i) {
      case 0 :
          alg[0] = new RedBlackValidate(canvas, execPanel[0]);
          execFrame[0].setTitle("Validate Algorithm");
          System.out.println("Validate Algorithm");
          algItem = new JMenuItem("Validate Algorithm");
          algorithmMenu.add(algItem);
          break;
      default:
         break;         
      }
   }


   public static void main(String args[]) {
      int i, nAlgs = 1; //nAlgs = 7;

      alg = new SkaProgram[nAlgs];
      execPanel = new SkaExecutionPanel[nAlgs];
      execFrame = new JFrame[nAlgs];

      // canvas.setDebugGraphicsOptions(DebugGraphics.BUFFERED_OPTION);
      setupFrames(nAlgs);
      canvasFrame.setVisible(true);


      for (i=0; i < alg.length; i++) {
         createProgram(i);
         execFrame[i].setVisible(true);
         alg[i].start();
         alg[i].displayAlgorithm();
      }

      while (true) {
         for (i=0; i < alg.length; i++) 
            if (execPanel[i].isReset()) {
               alg[i].terminate();
               createProgram(i);
               alg[i].start();
               execPanel[i].unreset();
            }         
      }
   }
}  // End class SkaTest
هل كانت مفيدة؟

المحلول

لا حرج في ذلك isReset, ولكن لن هذه الحلقة مجرد دعوة أكثر من (وتكرارا...)?

 while (true) {
     for (i=0; i < alg.length; i++) 
        if (execPanel[i].isReset()) {
           alg[i].terminate();
           createProgram(i);
           alg[i].start();
           execPanel[i].unreset();
        }         
  }

إذا كان أي شيء آخر ، يمكنك صفعة Thread.yield() هناك قوة الخيط إلى التخلي عن شريحة الوقت بانتظام حتى لا خنزير وحدة المعالجة المركزية.

سيكون من الأفضل أن نترك الاقتراع بدلا من استخدام المستمع النهج القائم على.تسمح execPanels إخطار المستمعين عندما يتم إعادة تعيين بدلا من حلقة واحدة مرارا نطلب منهم إذا كان يتم إعادة تعيين.هذا الرمز هو ما يعادل "نحن هناك حتى الآن ؟ نحن هناك حتى الآن ؟ نحن هناك حتى الآن؟"

قد ترى أيضا المستمعين يشار إلى المراقبين.إذا كنت ننظر حولنا للحصول على مزيد من المعلومات حول هذا تصميم نمط الكثير من المعلومات الجيدة سوف يحضر استخدام كلا المصطلحين.

على سبيل المثال

هنا هو كيف يمكن كتابة التعليمات البرمجية الخاصة بك إلى استخدام المستمع المفهوم.أعتذر عن أي أخطاء في هذا القانون ، لم جمعت.نأمل الأفكار واضحة على الرغم من أي أخطاء قد يكون في التعليمات البرمجية.

إذا كان رمز لا معنى له الحق بعيدا ، تحقق من الروابط أعلاه.أو يمكنك أن تلعب حولها مع EventListeners, التي سوف تستخدم في كل وقت عندما كنت لا سوينغ برمجة واجهة المستخدم الرسومية.

public class SkaExecutionPanel {
    // Anybody who wants to be told when a panel is reset will implement
    // this interface and call addListener().
    public interface Listener {
        void panelReset(SkaExecutionPanel panel);
    }

    // Each panel needs to maintain an internal list of listeners.
    private List<Listener> listeners = new ArrayList<Listener>();

    public void addListener(Listener listener) {
        listeners.add(listener);
    }

    public void removeListener(Listener listener) {
        listeners.remove(listener);
    }

    public void reset() {
        /* Do your thing. */

        // When something happens that the listeners will care about, such as a
        // call to reset() in this case, you iterate through the list and tell
        // each one what's happened.
        for (Listener listener: listeners) {
            listener.panelReset(this);
        }
    }
}

public class SkaTest {
    public static void main(String args[]) {
        /* Snippety snip. */

        for (i=0; i < alg.length; i++) {
            // Here we need to tell the execPanels that we want to do something
            // whenever somebody calls reset() on them. We will add a listener
            // to each panel that does the terminate/createProgram/start dance.
            // This way we don't have to ask the panels when they are reset; 
            // instead they will tell us when that happens.
            execPanel[i].addListener(new SkaExecutionPanel.Listener() {
                final int index = i;

                public void panelReset(SkaExecutionPanel panel) {
                    alg[index].terminate();
                    createProgram(index);
                    alg[index].start();
                    execPanel[index].unreset();
                }
            });
        }
    }
}

نصائح أخرى

هذا من تحرير جوابي على سؤالك الأول بعد إضافة هذه المعلومات:

"تحرير:في حين أن حلقة حلقة لا نهائية مما تسبب في حلقة لتشغيل فيها كل عنصر في صفيف وقد تم التحقق لمعرفة ما إذا تم إعادة تعيين.يمكنك استبدال هذا مع مراقب نمط حيث عندما كائن تعيين ذلك بإعلام مراقبة كائن ثم يؤدي ذلك مجموعة من الخطوات.وبهذه الطريقة لم يكن لديك حلقة لا نهائية و خفض استخدام .isReset()."

تحرير:المشكلة مع إجابات أخرى هو أن قليلا من رمز رائحة استخدام حلقة لا نهائية في رأيي.

تحرير 2:هنا مقالة ويكيبيديا مع مثال على ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top