2011-07-30 17 views
6

मैं एक SwingWorker उपयोग करने के लिए परिणाम के साथ एक JLabel एक लंबा कार्य को और अद्यतन करने के लिए कोशिश कर रहा हूँ के साथ जमा देता है उत्तरदायी रहेगा जब तक कि दो धागे समाप्त नहीं हो जाते हैं, जिस बिंदु पर गुई फ्रीज होता है जबकि धागे चल रहे होते हैं। अगर मैं एक समय में केवल एक धागा चलाता हूं, तो यह समस्या अभी भी होती है।जावा जीयूआई भी SwingWorker

मैं बहुत अच्छा होगा अगर कोई यह बता सकता है कि क्या मैं स्विंगवर्कर का गलत इस्तेमाल कर रहा हूं या यदि कोई और समस्या है तो मुझे पता नहीं है। आपके समय के लिए धन्यवाद। इयान

संपादित

doCalculation() बस कुछ समय लगता है:

private String doCalculation() { 
    for (int i = 0; i < 10000000; i++) { 
     Math.pow(3.14, i); 
    } 
    return threads++ + ""; 
} 
+1

मुझे अब तक आपके द्वारा पोस्ट किए गए कोड के साथ कुछ भी गलत नहीं दिख रहा है, लेकिन मुझे लगता है कि यहां की कुंजी 'डॉक्यूलेशन(); विधि में क्या हो रही है। क्या आप इस कोड को पोस्ट कर सकते हैं? –

उत्तर

6

मैं माफी चाहता हूँ, लेकिन फिर भी अपने doCalculate() विधि के साथ, मैं अभी भी नहीं पा रहा हूँ अपनी समस्या को पुन: उत्पन्न करने के लिए। उदाहरण के लिए यहाँ मेरी sscce है:

import java.awt.event.*; 
import java.util.concurrent.ExecutionException; 
import javax.swing.*; 

public class FooGui { 
    private static int threads = 0; 

    private static void createAndShowUI() { 
     final JLabel label = new JLabel("  "); 
     JButton button = new JButton("Button"); 
     button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      new SwingWorker<String, Void>() { 

       @Override 
       protected String doInBackground() throws Exception { 
        return doCalculation(); 
       } 

       @Override 
       protected void done() { 
        try { 
        label.setText(get()); 
        } catch (InterruptedException e) { 
        System.out.println("thread was interrupted"); 
        } catch (ExecutionException e) { 
        System.out.println("there was an ExecutionException"); 
        } 
       } 
      }.execute(); 
     } 
     }); 
     JPanel panel = new JPanel(); 
     panel.add(button); 
     panel.add(label); 

     JFrame frame = new JFrame("FooGui"); 
     frame.getContentPane().add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static String doCalculation() { 
     for (int i = 0; i < 5000000; i++) { 
     Math.pow(3.14, i); 
     } 
     return threads++ + ""; 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

आप बना सकते हैं और अपना खुद का "Short, Self Contained, Correct (Compilable), Example" or SSCCE पोस्ट करने के लिए (लिंक देखें) चाह सकते हैं। मैं शर्त लगाऊंगा कि इसे बनाने की प्रक्रिया में, आपको शायद समस्या और इसका समाधान मिल जाएगा। यदि ऐसा है, तो कृपया यहां वापस आना सुनिश्चित करें और हमें बताएं।

मुझे पता है कि यह वास्तव में एक उत्तर नहीं है, लेकिन इस तरह के कोड को टिप्पणी में पोस्ट करने का कोई तरीका नहीं है।

+1

मदद के लिए धन्यवाद, मैं इसकी सराहना करता हूं। मुझे आपके उदाहरण में भी वही ठंडा पाया गया, इसलिए मैंने इसका प्रयोग किया। ग्रहण/कमांड लाइन से चलना इसे पुन: उत्पन्न करता है। मैंने एक रननेबल जार बनाया और यह पूरी तरह से चलता है। मैं 64-बिट विंडोज 7 चला रहा हूं। मैंने इसे उबंटू के साथ करने की कोशिश की और यह भी समस्या को ठीक करने लगता है। एक बार फिर धन्यवाद। – Ian

+0

मैं कभी भी श्रोता के अंदर नहीं देखता हूं, मुझे यकीन नहीं है ..., लेकिन आपकी पोस्ट, शायद यह संभव तरीका है, अच्छा उदाहरण, कोई प्रदर्शन समस्या +1 – mKorbel

+1

@Ian: एचएम, यह अभी भी अच्छा होगा पता है कि उन निश्चित परिस्थितियों में ठंड क्यों होती है। शायद इसे बहुत सारे धागे से करना है। मैंने सुना है कि कई बार जब आप स्विंगवर्कर का उपयोग नहीं कर सकते हैं तो कई धागे से निपटने के दौरान, लेकिन इसके बजाय एक एक्जिक्यूटर्स सर्विस और थ्रेड पूल का उपयोग करने की आवश्यकता होगी। –

संबंधित मुद्दे