From christianherlambang at gmail.com Fri May 11 22:01:08 2007 From: christianherlambang at gmail.com (Christian Herlambang) Date: Fri, 11 May 2007 22:01:08 +0200 Subject: [imapping-dev] Mac Bug: How to and not produce the bug Message-ID: Hello iMap-devs, 1. Who am I? I am a new working student in FZI. Heiko Haller is my advisor. My first task is helping other iMapping-devs to solve the mac-bug. 2. Mac Bug: How to and not produce the bug a. Problem: imapping-pkm/src/main/java/org.ontoware.imapping.pkm/ PKMApplication.java freezes after running a few seconds (the rainbow wheel of death) b. Approach to find the bug I replace the entire code in PKMApplication with a little JFrame example (see my attachment) and try to make it run. Result: it freezes. Then, I stop the PKMApplication.java and configure the build path in imapping-pkm. I remove all the required projects on the build path: imapping-core, imapping-gui, imapping-libs and run the PKMApplication.java Result: the program doesn't freeze 3.Summary I don't know if my founding is a help for the other imapping-devs. I just want to let you know that the bug is caused by libraries that PKMApplication import from. Christian -------------- next part -------------- package org.ontoware.imapping.pkm; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public final class PKMApplication { private static JButton good = new JButton("Good"); private static JButton bad = new JButton("Bad"); private static JButton bad2 = new JButton("Bad2"); private static JLabel resultLabel = new JLabel("Ready", JLabel.CENTER); public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Layout . . . JPanel p = new JPanel(); p.setOpaque(true); p.setLayout(new FlowLayout()); p.add(good); p.add(bad); p.add(bad2); Container c = f.getContentPane(); c.setLayout(new BorderLayout()); c.add(p, BorderLayout.CENTER); c.add(resultLabel, BorderLayout.SOUTH); // Listeners good.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { resultLabel.setText("Working . . ."); setEnabled(false); // We're going to do something that takes a long time, so we // spin off a thread and update the display when we're done. Thread worker = new Thread() { public void run() { // Something that takes a long time . . . in real life, this // might be a DB query, remote method invocation, etc. try { Thread.sleep(5000); } catch (InterruptedException ex) {} // Report the result using invokeLater(). SwingUtilities.invokeLater(new Runnable() { public void run() { resultLabel.setText("Ready"); setEnabled(true); } }); } }; worker.start(); // So we don't hold up the dispatch thread. } }); bad.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { resultLabel.setText("Working . . ."); setEnabled(false); // We're going to do the same thing, but not in a separate thread. try { Thread.sleep(5000); // Dispatch thread is starving! } catch (InterruptedException ex) {} // Report the result. resultLabel.setText("Ready"); setEnabled(true); } }); bad2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { resultLabel.setText("Working . . . "); setEnabled(false); // The wrong way to use invokeLater(). The runnable() shouldn't // starve the dispatch thread. SwingUtilities.invokeLater(new Runnable() { public void run() { try { Thread.sleep(5000); // Dispatch thread is starving! } catch (InterruptedException ex) {} resultLabel.setText("Ready"); setEnabled(true); } }); } }); f.setSize(300, 100); f.setVisible(true); } // Allows us to turn the buttons on or off while we work. static void setEnabled(boolean b) { good.setEnabled(b); bad.setEnabled(b); bad2.setEnabled(b); } }