2010-07-03 18 views
5

के लिए प्रतीक्षा करने के लिए मुझे एक कार्यकर्ता धागा मिला है जो निरंतर निष्पादन से पहले जीयूआई को अपडेट करने के लिए ईडीटी की प्रतीक्षा करनी चाहिए। मैंने कुछ बदलने के लिए ईडीटी को बताने के लिए प्रकाशित विधि का उपयोग किया है। मैं उस बदलाव के लिए कार्यकर्ता का इंतजार कैसे कर सकता हूं?जावा स्विंग वर्कर थ्रेड ईडीटी

+2

क्या आपका मतलब 'रोकें' बटन जैसा है? – trashgod

+2

कोशिश करना चाहते हैं कि वास्तव में एक बुरी चीज की तरह लगता है। –

उत्तर

4

यदि यह भी अपने ही कार्यकर्ता धागा कि जीयूआई परिवर्तन की शुरुआत कर रहा है, तो इंतजार कर के लिए उन परिवर्तनों को किए जाने के लिए के लिए एक तैयार बनाया तंत्र है:

SwingUtilities.invokeAndWait()

अच्छी तरह से बिल को फिट करना चाहिए।

ईडीटी को चलाने के लिए कुछ कोड चलाने के लिए SwingUtilities.invokeLater() का उपयोग करने के लिए एक और विकल्प होगा, जो ईडीटी निष्क्रिय होने के बाद आपके थ्रेड को जगाएगा, यानी जब यह इस कार्य को चलाने के लिए घूमता है। इसमें invokeLater() को तत्काल wait() से फायरिंग शामिल होगी और उम्मीद है कि wait() करने से पहले ईडीआई से जागने से पहले नहीं होता है। हालांकि, समय के संबंध में यह काफी मूर्खतापूर्ण नहीं है।

5

मुझे लगता है कि आप अपने परिणाम प्रकाशित करने के लिए स्विंगवर्कर का उपयोग कर रहे हैं। आप यह इंगित करने के लिए एक बूलियन ध्वज का उपयोग कर सकते हैं कि मान संसाधित हो गया है। यह ध्वज इंटरमीडिएट परिणामों को प्रकाशित करने से पहले साफ़ किया जाता है, और फिर सेट होने तक धागे को अवरुद्ध करने के लिए उपयोग किया जाता है। यूआई थ्रेड ध्वज सेट करता है जब इसे प्रकाशित डेटा को पूरा करने के रूप में पूरा किया जाता है।

class MyWorker extends SwingWorker<K,V> 
{ 
    boolean processed = true; 

    protected void doInBackground() { 
     for (;;) { 
      setProcessed(false); 
      publish(results); 
      waitProcessed(true); 
     } 
    } 

    synchronized void waitProcessed(boolean b) { 
     while (processed!=b) { 
      wait(); 
     } 
     // catch interrupted exception etc. 
    } 

    synchronized void setProcessed(boolean b) { 
     processed = b; 
     notifyAll(); 
    } 


    protected void process(List<V> results) { 
     doStuff(); 
     setProcessed(true); 
    } 
} 
+0

आपके उत्तर के लिए धन्यवाद। मैंने कार्ल स्मोट्रिक्स की विधि को चुना है, हालांकि, यह मेरी स्थिति में अधिक समझ में आया और मैं पूरी तरह से invokeAndWait के बारे में भूल गया था। लेकिन आपके द्वारा सुझाई गई विधि अभी भी जानना अच्छा है। – Mihaela